我可以通过快速扩展将协议一致性添加到协议中吗?
//Plain old protocol here
protocol MyData {
var myDataID: Int { get }
}
我想默认使 MyData
协议相等(只需比较ID)
extension MyData : Equatable { }
但我得到了这个可爱的错误:
“协议的扩展'MyData'不能有继承子句”
我正在寻找的行为是符合Equatable(协议)的BananaData,因为它实现了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
}
2 回答
正如错误消息所示:协议的扩展不能具有继承子句 . 相反,您可以在原始声明中使
MyData
协议从Equatable
继承 .然后,您可以为符合
MyData
的类型添加==
的实现:但是, I would highly not recommend this! 如果向符合类型添加更多属性,则不会检查其属性是否相等 . 举个例子:
在上面的情况中,您需要为
SomeData
覆盖==
以获得正确的结果,从而使==
接受MyData
冗余 .这个游乐场能做你想做的吗?我是根据我从WWDC 2015的Protocol-Oriented Programming in Swift了解到的 .