Swift, iOS:如何从具体类型获得多态和解耦协调器



我有这些协议:

protocol Coordinator {
var rootViewController: UIViewController { get set }
func start()
}
protocol UIViewControllerFactory {
func mainViewController() -> UIViewController
}

我创建了一个符合这个协议的MainCoordinator,我传递了一个工厂,允许我将协调器从创建和捕获具体类型中解耦,因此它可以是多态的并且可以与UIViewController的更多实现一起使用,如rootViewControllersmainMenuViewController如下所示:

class MainCoordinator: Coordinator {
var rootViewController: UIViewController
let factory: UIViewControllerFactory 

init(rootViewController: UIViewController, factory: UIViewControllerFactory) {
self.rootViewController = rootViewController
}

start() {
guard let mainVC = factory.mainViewController() as? MainViewController, let rootViewController = rootViewController as? UINavigationViewController  else { return }

mainVC.delegate = self
rootViewController.push(mainVC, animated: true)
}

正如你所看到的,虽然我已经创建了协调器来接受UIViewController的任何子类,但它已经在start函数中耦合到UIViewController的具体实现:MainViewController。

我如何从MainViewController解耦,并有它更多的多态

?

可以在工厂函数中传递coordinator作为参数类型,在创建控制器实例时直接在工厂函数中设置delegate。这样,您就不必在工厂类之外显式地暴露控制器type

我想出了下面的方法。

protocol Coordinator {
var rootViewController: UIViewController { get set }
func start()
}
protocol UIViewControllerFactory {
func getViewController(delegateType:CoordinatoreTypes,delegateObject:Coordinator) -> UIViewController?
}
class MainCoordinator: Coordinator {
var rootViewController: UIViewController
let factory: UIViewControllerFactory

init(rootViewController: UIViewController, factory: UIViewControllerFactory) {
self.rootViewController = rootViewController
self.factory = factory
}

func start() {
guard let controller = factory.getViewController(delegateType: .MainCoordinator, delegateObject: self),let rootViewController = rootViewController as? UINavigationViewController else {
return
}
rootViewController.push(mainVC, animated: true)
}
}
extension MainCoordinator:DelegateCaller{
func printHello() {
print("helloo")
}
}
enum CoordinatoreTypes{
case MainCoordinator
case none
}
class Factory:UIViewControllerFactory{
func getViewController(delegateType:CoordinatoreTypes,delegateObject:Coordinator) -> UIViewController?{
switch delegateType{
case .MainCoordinator:
let controller = MainViewController()
controller.delegate = delegateObject as? MainCoordinator
return controller
case .none:
break
}
return nil
}
}
class MainViewController:UIViewController{
weak var delegate:DelegateCaller?
}
protocol DelegateCaller:AnyObject{
func printHello()
}

相关内容

  • 没有找到相关文章

最新更新