/ / Modul generic de returnare a următoarelor: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Modul generic de returnare a urmatoarelor: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Aplicația mea poate schimba dinamic AppBaseController (Prezentată după autentificare). Poate fi una dintre următoarele:

Controller meniu (Tip UIViewController), UINavigationController sau UITabBarController

Am creat acest controler cu o fabrică și aș vrea ca fabrica să se conformeze unui protocol care arată astfel:

protocol MainRootApplication {
func create() -> UIViewController
}

2 exemple de fabrici care confirmă: (Utilizând AutoInject Swinject pentru injecția de dependență)

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

După cum puteți vedea, acest lucru nu poate fi realizat deoarece "MainTabBarController" nu este de tip UIViewController.

Există oricum acest lucru fără a forța forța?

Răspunsuri:

1 pentru răspunsul nr. 1

Poate utilizați un tip asociat?

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

Și apoi fabricile dvs. vor fi:

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

Întrebări corelate


Comentarii (0)

Adauga un comentariu