我的应用程序可以动态地更改AppBaseController (登录后显示)。它可以有以下几点:
菜单控制器( UIViewController)、UINavigationController或UITabBarController
我正在用工厂创建这个控制器,并希望工厂遵循如下协议:
protocol MainRootApplication {
func create() -> UIViewController
}工厂确认的两个示例:(使用AutoInject Swinject进行依赖项注入)
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)!
}
}正如您所看到的,这是无法完成的,因为"MainTabBarController“不是UIViewController类型的。
在没有强制铸造的情况下就能做到这一点吗?
发布于 2017-11-12 12:36:24
或者用一种关联类型?
protocol MainRootApplication {
associatedtype ControllerType: UIViewController
func create() -> ControllerType
}然后你的工厂就会像:
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)!
}
}https://stackoverflow.com/questions/47248599
复制相似问题