/ / Генерички начин враћања на следеће: УИВиевЦонтроллер, УИНавигатионЦонтроллер, УИТабЦонтроллер - иос, ипхоне, свифт

Општи начин повратка на следеће: УИВиевЦонтроллер, УИНавигатионЦонтроллер, УИТабЦонтроллер - иос, ипхоне, свифт

Моја апликација може динамички да мења АппБасеЦонтроллер (представљено након пријаве). Може бити од следећег:

Контролер менија (тип УИВиевЦонтроллер), УИНавигатионЦонтроллер или УИТабБарЦонтроллер

Креирам овај контролер са фабриком, и желео бих да фабрика одговара протоколу који изгледа овако:

protocol MainRootApplication {
func create() -> UIViewController
}

2 примерка фабрике која потврђују: (Коришћење АутоИњецт Свињецт за ињекцију зависности)

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

Као што видите, ово се не може постићи јер "МаинТабБарЦонтроллер" није типа УИВиевЦонтроллер.

Да ли је то ипак могуће урадити без бацања силе?

Одговори:

1 за одговор № 1

Можда користите придружени тип?

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

Сродна питања


Коментари (0)

Додајте коментар