/ / Mode générique de restitution des éléments suivants: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Mode générique de renvoi des éléments suivants: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Mon application peut modifier dynamiquement AppBaseController (présenté après la connexion). Il peut s'agir de:

Contrôleur de menu (type UIViewController), UINavigationController ou UITabBarController

Je crée ce contrôleur avec une usine et souhaite que l’usine se conforme à un protocole ressemblant à ceci:

protocol MainRootApplication {
func create() -> UIViewController
}

2 exemples d’usines qui confirment: (Utilisation de l’auto-injection Swinject for Dependency)

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

Comme vous pouvez le constater, cela ne peut pas être accompli car "MainTabBarController" n'est pas de type UIViewController.

Y at-il quand même faire cela sans forcer le casting?

Réponses:

1 pour la réponse № 1

Peut-être utiliser un type associé?

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

Et alors vos usines seront comme:

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

questions connexes


Commentaires (0)

Ajouter un commentaire