我可以通过 swift 扩展向协议添加协议一致性吗?
//Plain old protocol here
protocol MyData {
var myDataID: Int { get }
}
我想做MyData
协议默认相等(只需比较ID)
extension MyData : Equatable { }
但我得到了这个可爱的错误:
“协议‘MyData’的扩展不能有继承子句”
我正在寻找的行为是 BananaData 符合 Equatable (协议),因为它实现了 MyData 协议,该协议可以提供 Equatable 的默认实现
//This is the method to implement Equatable
func ==(lhs: MyData, rhs: MyData) -> Bool {
return lhs.myDataID == rhs.myDataID
}
struct BananaData: MyData {
var myDataID: Int = 1
}
func checkEquatable(bananaOne: BananaData, bananaTwo: BananaData) {
//This compiles, verifying that BananaData can be compared
if bananaOne == bananaTwo { }
//But BananaData is not convertible to Equatable, which is what I want
let equatableBanana = bananaOne as Equatable
//I don't get the additional operations added to Equatable (!=)
if bananaOne != bananaTwo { } //Error
}
正如错误消息所示:协议的扩展不能有继承子句。相反,你可以使MyData
协议继承自Equatable
在原来的声明中。
protocol MyData: Equatable {
var myDataID: Int { get }
}
然后你可以扩展添加一个实现==
对于符合以下条件的类型MyData
:
func == <T: MyData>(lhs: T, rhs: T) -> Bool {
return lhs.myDataID == rhs.myDataID
}
然而,我强烈不推荐这个!如果向一致类型添加更多属性,则不会检查它们的属性是否相等。以下面的例子为例:
struct SomeData: MyData {
var myDataID: Int
var myOtherData: String
}
let b1 = SomeData(myDataID: 1, myOtherData: "String1")
let b2 = SomeData(myDataID: 1, myOtherData: "String2")
b1 == b2 // true, although `myOtherData` properties aren't equal.
在上面的情况下你需要重写==
for SomeData
以获得正确的结果,从而使==
接受MyData
多余的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)