/ / Ogólny sposób zwracania się do: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Ogólny sposób zwracania się do: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Moja aplikacja może dynamicznie zmieniać AppBaseController (prezentowane po zalogowaniu). Może być jednym z następujących:

Kontroler menu (typ UIViewController), UINavigationController lub UITabBarController

Tworzę ten kontroler w fabryce i chciałbym, aby fabryka była zgodna z protokołem, który wygląda tak:

protocol MainRootApplication {
func create() -> UIViewController
}

2 przykłady fabryczne, które potwierdzają: (przy użyciu funkcji AutoInject Swinject dla wtrysku zależności)

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

Jak widać, nie można tego osiągnąć, ponieważ "MainTabBarController" nie jest typu UIViewController.

Czy tak jest, aby to zrobić bez użycia siły?

Odpowiedzi:

1 dla odpowiedzi № 1

Może użyć skojarzonego typu?

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

A wtedy twoje fabryki będą wyglądać tak:

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

Powiązane pytania


Komentarze (0)

Dodaj komentarz