/ / Generiskt sätt att återvända på följande: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Generellt sätt att återvända på följande: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Min app kan dynamiskt ändra AppBaseController (presenteras efter inloggning). Det kan vara på följande:

Menykontroll (Typ UIViewController), UINavigationController eller UITabBarController

Jag skapar den här kontrollenheten med en fabrik och vill att fabriken ska överensstämma med ett protokoll som ser ut så här:

protocol MainRootApplication {
func create() -> UIViewController
}

2 exempel på fabriken som bekräftar: (Använda AutoInject Swinject för 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 detta inte uppnås eftersom "MainTabBarController" inte är av typen UIViewController.

Det där ändå för att göra det utan kraftgjutning?

svar:

1 för svaret № 1

Kanske använda en tillhörande typ?

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

Och då kommer dina fabriker att vara:

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)!
}
}

Relaterade frågor


Kommentarer (0)

Lägg till en kommentar