/ / Generički način vraćanja na sljedeće: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Generički način vraćanja sljedećeg: UIViewController, UINavigationController, UITabController - ios, iphone, swift

Moja aplikacija može dinamički promijeniti AppBaseController (predstavljeno nakon prijave). Može biti od sljedećeg:

Kontroler izbornika (tip UIViewController), UINavigationController ili UITabBarController

Stvaram ovaj kontroler s tvornicom i želio bih da tvornica odgovara protokolu koji izgleda ovako:

protocol MainRootApplication {
func create() -> UIViewController
}

2 primjera tvorničkih postavki koje potvrđuju: (pomoću injekcije AutoInject Swinject za ovisnost o ovisnosti)

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

Kao što možete vidjeti, to se ne može postići jer "MainTabBarController" nije tipa UIViewController.

Je li to ionako moguće učiniti bez lijevanja sile?

odgovori:

1 za odgovor № 1

Možda koristite pridruženu vrstu?

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

Tada će vaše tvornice biti kao:

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

Povezana pitanja


Komentari (0)

Dodaj komentar