簡體   English   中英

Swift、iOS:如何從具體類型中獲取多態和解耦協調器

[英]Swift, iOS: How to get Polymorphic and Decouple Coordinator from concrete type

我有這些協議:

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 的任何子類,但它在開始時已將 function 耦合到 UIViewController 的具體實現:MainViewController。

所以我的問題是如何將它與 MainViewController 分離並使其更具多態性

您可以在工廠 function 中將協調器作為參數類型傳遞,並在創建 controller 實例時直接在工廠 function 中設置delegate 這樣您就不必從工廠類中顯式公開 controller 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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM