/ / 다음 중 반환의 일반적인 방법 : UIViewController, UINavigationController, UITabController - ios, iphone, swift

다음 중 반환하는 일반적인 방법 : UIViewController, UINavigationController, UITabController - ios, iphone, swift

내 응용 프로그램은 AppBaseController (로그인 후 표시)를 동적으로 변경할 수 있습니다. 그것은 다음 중 하나 일 수 있습니다 :

메뉴 컨트롤러 (UIViewController 유형), UINavigationController 또는 UITabBarController

나는이 컨트롤러를 팩토리와 함께 만들고 공장이 다음과 같은 프로토콜을 따르길 원한다.

protocol MainRootApplication {
func create() -> UIViewController
}

확인하는 Factory의 2 가지 예 : (Dependency injection을위한 AutoInject Swinject 사용)

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)

의견을 추가하다