/ / Generisk måde at returnere på følgende: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Generisk måde at vende tilbage på af følgende: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Min app kan dynamisk ændre AppBaseController (præsenteret efter login). Det kan være af følgende:

Menu controller (Type UIViewController), UINavigationController eller UITabBarController

Jeg skaber denne controller med en fabrik, og jeg vil gerne have, at fabrikken overholder en protokol, der ser sådan ud:

protocol MainRootApplication {
func create() -> UIViewController
}

2 eksempler på Factory 's, der bekræfter: (Brug AutoInject Swinject for Dependency injektion)

class MenuControllerFactory: Factory,MainRootApplication {
func create() -> MenuController {
self.container.autoregister(MenuController.self, initializer: MenuController.init)
return self.container.resolve(MenuController.self)!
}
}

class MainTabBarControllerFactory: Factory, MainRootApplication {
func create() -> MainTabBarController {
self.container.autoregister(MainTabBarController.self, initializer: MainTabBarController.init)
return self.container.resolve(MainTabBarController.self)!
}
}

Som du kan se, kan dette ikke opnås, fordi "MainTabBarController" ikke er af typen UIViewController.

Er der alligevel at gøre dette uden kraftstøbning?

svar:

1 for svar № 1

Måske bruge en tilknyttet type?

protocol MainRootApplication {
associatedtype ControllerType: UIViewController
func create() -> ControllerType
}

Og så vil dine fabrikker være som:

class MenuControllerFactory: Factory,MainRootApplication {
typealias ControllerType = MenuController
func create() -> MenuController {
self.container.autoregister(MenuController.self, initializer: MenuController.init)
return self.container.resolve(MenuController.self)!
}
}

class MainTabBarControllerFactory: Factory, MainRootApplication {
typealias ControllerType = MainTabBarController
func create() -> MainTabBarController {
self.container.autoregister(MainTabBarController.self, initializer: MainTabBarController.init)
return self.container.resolve(MainTabBarController.self)!
}
}

Beslægtede spørgsmål


Kommentarer (0)

Tilføj en kommentar