我们正在将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;
现在,在子类中,我们可以调用ContentCoordinatorDelegate
和CoordinatorDelegate
中声明的任何方法。但是,由于我们无法在Swift中更改覆盖属性的类型,因此我们无法通过以下方式进行操作:
类型为“ ContentCoordinatorDelegate?”的属性“ delegate”?无法覆盖类型为“ CoordinatorDelegate?”的属性?
我知道那里的所有教程都使用基于协议的解决方案,因此我也尝试过。不幸的是,由于同样的原因,这对我们也不起作用,我们需要在协调器中定义委托的类型,但之后我们就无法在实现中更改该类型。
我已经探索了使用关联类型,但是由于错误而无法正常工作
协议'Coordinator'只能用作一般约束,因为它具有Self或关联的类型要求
我也尝试过使用泛型,但出现错误:
协议类型'ContentCoordinatorDelegate'不符合'CoordinatorDelegate',因为只有具体类型可以符合协议
我怀疑这里缺少明显的东西,但是任何帮助都将不胜感激。