/ / Forma genérica de regresar de lo siguiente: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Forma genérica de regresar de lo siguiente: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Mi aplicación puede cambiar dinámicamente AppBaseController (Presentado después de iniciar sesión). Puede estar encendido de lo siguiente:

Controlador de menú (tipo UIViewController), UINavigationController o UITabBarController

Estoy creando este controlador con una fábrica, y me gustaría que la fábrica se ajuste a un protocolo similar al siguiente:

protocol MainRootApplication {
func create() -> UIViewController
}

2 ejemplos de Fábrica que confirman: (Uso de AutoInject Swinject para inyección de dependencia)

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

Como puede ver, esto no se puede lograr porque "MainTabBarController" no es del tipo UIViewController.

¿De todas formas hay que hacer esto sin forzar el lanzamiento?

Respuestas:

1 para la respuesta № 1

Tal vez utilice un tipo asociado?

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

Y entonces tus fábricas serán como:

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

preguntas relacionadas


Comentarios (0)

Añadir un comentario