swift iOS 中的面向协议编程

Protocol Oriented Programming in swift iOS

这里是 Protocols:

protocol WireFrameProtocol{
    // router for all normal cases
    // like showing login page
    
}

protocol InteractorProtocol{
    var wireFrame: WireFrameProtocol? { get set }
}

protocol HomeWireFrameProtocol: WireFrameProtocol{
    // home specific routers
}

protocol HomeInteractorProtocol: InteractorProtocol{
    var wireFrame: HomeWireFrameProtocol? { get set }
}

class Test: HomeInteractorProtocol{
    var wireFrame: HomeWireFrameProtocol?
}

extension Test: InteractorProtocol{
    
}

WireFrameProtocol 将具有所有路由功能。 HomeWireFrameProtocol 将扩展并仅包含一些与家庭相关的路由。测试 class 继承自 HomeInteractorProtocol,它有一个 var wireFrame:HomeWireFrameProtocol,再次 HomeWireFrameProtocol 扩展了 WireFrameProtocol.

var wireFrame: HomeWireFrameProtocol是不是也代表var wireFrame: WireFrameProtocol

如果我对你的问题的理解正确,那么你刚刚遇到了一个传统的 Dimond Problem,其中关于特定功能是从哪个父 class 继承的是模棱两可的。

您的 viewwireFrame 都是在 HomeViewPresenterProtocolHomeViewInteractorOutputProtocol 中声明的变量。因此,当您在 HomeViewPresenter 中确认这两个协议时,就会出现 Dimond 问题。编译器混淆了这个模棱两可的父级。

最简单的解决方案是更改变量名称,因为您不能使用相同的变量或函数签名。

好的,我现在明白了,解决了我自己的问题。我所做的是

protocol HomeInteractorProtocol: InteractorProtocol{
    // do not create another variable to store HomeWireFrame
    // var wireFrame: HomeWireFrameProtocol? { get set }
}

变量wireFrame: WireFrameProtocol也可以保存HomeWireFrameProtocol的引用。

所以在测试中 class 我更新了:

class Test: HomeInteractorProtocol{
    // can use all features from the WireFrameProtocol
    var wireFrame: WireFrameProtocol?

    // also can use all the feature from HomeWireFrame
    // this is kind of what I want to achieve without creating two different variables in the protocols
    var homeWireFrame: HomeWireFrameProtocol? {
         return wireFrame as? HomeWireFrameProtocol
    }
}

extension Test: InteractorProtocol{
    
}