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 继承的是模棱两可的。
您的 view
和 wireFrame
都是在 HomeViewPresenterProtocol
和 HomeViewInteractorOutputProtocol
中声明的变量。因此,当您在 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{
}
这里是 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 继承的是模棱两可的。
您的 view
和 wireFrame
都是在 HomeViewPresenterProtocol
和 HomeViewInteractorOutputProtocol
中声明的变量。因此,当您在 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{
}