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

Generell måte å returnere på av følgende: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Min app kan dynamisk endre AppBaseController (Presented after login). Det kan være av følgende:

Meny kontroller (Type UIViewController), UINavigationController, eller UITabBarController

Jeg lager denne kontrolleren med en fabrikk, og jeg vil at fabrikken skal overholde en protokoll som ser slik ut:

protocol MainRootApplication {
func create() -> UIViewController
}

2 eksempler på fabrikkens bekreftelse: (Ved hjelp av AutoInject Swinject for Dependency injection)

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 oppnås fordi "MainTabBarController" ikke er av typen UIViewController.

Er det i alle fall å gjøre dette uten kraftgjennomføring?

svar:

1 for svar № 1

Kanskje bruk en tilknyttet type?

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

Og så vil fabrikkene 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)!
}
}

Beslektede spørsmål


Kommentarer (0)

Legg til en kommentar