Swift 2添加协议符合协议

我可以通过快速扩展添加协议一致的协议吗?
//Plain old protocol here
protocol MyData {
    var myDataID: Int { get }
}

我想使认的MyData协议相当(只是比较ID)

extension MyData : Equatable { }

但是我得到这个可爱的错误

“Extension of protocol ‘MyData’ cannot have an inheritance clause”

我正在寻找的行为是符合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
}
由于错误消息说:协议的扩展不能有继承子句.相反,您可以使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.

在上述情况下,您需要为SomeData重写==以获得正确的结果,从而使得接受MyData冗余的==.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...