Swift 2添加协议与协议的一致性

Kev*_*vin 20 protocols swift swift2

我可以通过快速扩展将协议一致性添加到协议中吗?

//Plain old protocol here
protocol MyData {
    var myDataID: Int { get }
}
Run Code Online (Sandbox Code Playgroud)

我想MyData默认使协议等同(只需比较ID)

extension MyData : Equatable { }
Run Code Online (Sandbox Code Playgroud)

但我得到了这个可爱的错误:

"协议扩展'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
}
Run Code Online (Sandbox Code Playgroud)

ABa*_*ith 24

正如错误消息所示:协议的扩展不能具有继承子句.相反,您可以在原始声明中进行MyData协议继承Equatable.

protocol MyData: Equatable {
    var myDataID: Int { get }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以扩展添加==符合以下类型的类型的实现MyData:

func == <T: MyData>(lhs: T, rhs: T) -> Bool {
    return lhs.myDataID == rhs.myDataID
}
Run Code Online (Sandbox Code Playgroud)

但是,我强烈不推荐这个!如果向符合类型添加更多属性,则不会检查其属性是否相等.举个例子:

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.
Run Code Online (Sandbox Code Playgroud)

在上述情况下你需要重写==SomeData正确的结果,从而使==接受MyData多余的.