/ / Загальний спосіб повернення до наступного: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Загальний спосіб повернення на наступне: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Моє додаток може динамічно змінювати AppBaseController (представлено після входу). Це може бути наступним чином:

Контролер меню (Type UIViewController), UINavigationController або UITabBarController

Я створюю цей контролер на заводі і хотів би, щоб завод відповідав протоколу, який виглядає так:

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

Як ви можете бачити, це неможливо виконати, тому що "MainTabBarController" не є типом UIViewController.

Це там як-небудь зробити це без сил лиття?

Відповіді:

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)

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