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
,它对于特定功能从哪个父类继承是模棱两可的。
您的view
和wireFrame
都是在HomeViewPresenterProtocol
和HomeViewInteractorOutputProtocol
中声明的变量。因此,当您在HomeViewPresenter
中确认这两个协议时,就会出现 Dimond 问题。编译器让这个模棱两可的父级感到困惑。
最简单的解决方案是更改变量名称,因为您不能拥有相同的变量或函数签名。
【讨论】:
我想这是唯一的解决方案。 我已经用一个计算变量修复了它,我认为这将是一个更好的方法。您对此有何看法?以上是关于swift iOS中的面向协议编程的主要内容,如果未能解决你的问题,请参考以下文章
什么是 Swift 中的面向协议编程?它带来了什么附加价值?