如何在Swift

时间:2019-11-20 18:09:10

标签: swift coordinator-pattern

我们正在将Obj-C项目迁移到Swift,我们试图维持相同的功能水平,同时尝试以更类似于Swift的方式进行操作。

我们广泛使用了协调器模式,但是在构建此模式时遇到了问题。主要问题是能够在基本实现中调用委托。

基于类的解决方案

下面是一个基于类的协调器,它是我们一直在使用的Obj-C协调器的Swift实现。

协议:

protocol CoordinatorDelegate: class {
    func coordinatorDidCancel(_ coordinator: Coordinator)
    func coordinatorWillCancel(_ coordinator: Coordinator)
}

班级:

class Coordinator {

    weak var delegate: CoordinatorDelegate?

    private(set) var navigationController: UINavigationController
    private(set) var childCoordinators: [Coordinator]

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
        self.childCoordinators = []
    }

    func start() {}

    func tearDown() {}

    final func cancel() {

        // Here we call the delegate from within the base class
        delegate?.coordinatorWillCancel(self)

        tearDown()

        cancelChildCoordinators()

        // And here
        delegate?.coordinatorDidCancel(self)

        delegate = nil

    }

    final func cancelChildCoordinators() {
        childCoordinators.forEach { childCoordinator in
            childCoordinator.cancel()
            removeChildCoordinator(childCoordinator: childCoordinator)
        }
    }

    final func addChildCoordinator(childCoordinator: Coordinator) {
        childCoordinators.append(childCoordinator)
    }

    final func removeChildCoordinator(childCoordinator: Coordinator) {
        childCoordinators = childCoordinators.filter { $0 !== childCoordinator }
    }

在我们的Obj-C实现中,当我们将协调器子类化时,我们可以如下重写delegate

@property (nonatomic, weak) NSObject <ContentCoordinatorDelegate, CoordinatorDelegate> *delegate;

现在,在子类中,我们可以调用ContentCoordinatorDelegateCoordinatorDelegate中声明的任何方法。但是,由于我们无法在Swift中更改覆盖属性的类型,因此我们无法通过以下方式进行操作:

  

类型为“ ContentCoordinatorDelegate?”的属性“ delegate”?无法覆盖类型为“ CoordinatorDelegate?”的属性?

基于协议的解决方案

我知道那里的所有教程都使用基于协议的解决方案,因此我也尝试过。不幸的是,由于同样的原因,这对我们也不起作用,我们需要在协调器中定义委托的类型,但之后我们就无法在实现中更改该类型。

其他选项

我已经探索了使用关联类型,但是由于错误而无法正常工作

  

协议'Coordinator'只能用作一般约束,因为它具有Self或关联的类型要求

我也尝试过使用泛型,但出现错误:

  

协议类型'ContentCoordinatorDelegate'不符合'CoordinatorDelegate',因为只有具体类型可以符合协议

我怀疑这里缺少明显的东西,但是任何帮助都将不胜感激。

0 个答案:

没有答案