swift iOS中的面向协议编程

Posted

技术标签:

【中文标题】swift iOS中的面向协议编程【英文标题】:Protocol Oriented Programming in swift iOS 【发布时间】:2020-06-29 05:36:49 【问题描述】:

这里是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 将扩展并仅具有一些与家庭相关的路由。测试类继承自HomeInteractorProtocol,它有一个var wireFrame:HomeWireFrameProtocol,同样HomeWireFrameProtocol是扩展WireFrameProtocol

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

【问题讨论】:

简化,简化,简化。这个问题很难阅读,因为它包含太多代码,请删除任何与问题无关的代码。还有一种语言也可以澄清问题,结构或类符合(或实现)协议。扩展是指一个类或协议从另一个类或协议继承。 @JoakimDanielson 一些基本协议,在其他特定协议中扩展这些协议并使用扩展协议创建类库。对于 TLDR;您可以构建一个要点并自己尝试以创建问题并解决它。 至于实际问题,如果协议定义了var x: String,您需要实现一个具有完全相同签名而不是几乎相同的属性。太糟糕了,你不能接受一些建议来帮助你改进你的问题。 我不明白问题是什么。你以为编译器出错了吗? @JoakimDanielson 我将尽快将问题降至最低。这样它就只会关注真正的问题。 【参考方案1】:

好的,我现在意识到了,并解决了我自己的问题。我所做的是

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

变量wireFrame: WireFrameProtocol也可以持有HomeWireFrameProtocol的引用。

所以在我更新的测试类中:

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
    

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我想这是唯一的解决方案。 我已经用一个计算变量修复了它,我认为这将是一个更好的方法。您对此有何看法?

以上是关于swift iOS中的面向协议编程的主要内容,如果未能解决你的问题,请参考以下文章

iOS-Swift 面向协议编程/组件化(模块化)编程思想

什么是 Swift 中的面向协议编程?它带来了什么附加价值?

什么是 Swift 中的面向协议编程?它带来了什么附加价值?

Swift中面向协议的编程

WWDC Swift 会话中面向协议的编程

Swift 学习笔记(面向协议编程)