Swift 2添加协议符合协议

前端之家收集整理的这篇文章主要介绍了Swift 2添加协议符合协议前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我可以通过快速扩展添加协议一致的协议吗?
  1. //Plain old protocol here
  2. protocol MyData {
  3. var myDataID: Int { get }
  4. }

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

  1. extension MyData : Equatable { }

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

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

我正在寻找的行为是符合Equatable(协议)的BananaData,因为它实现了MyData协议,该协议可以提供Equatable

  1. //This is the method to implement Equatable
  2. func ==(lhs: MyData,rhs: MyData) -> Bool {
  3. return lhs.myDataID == rhs.myDataID
  4. }
  5.  
  6. struct BananaData: MyData {
  7. var myDataID: Int = 1
  8. }
  9.  
  10. func checkEquatable(bananaOne: BananaData,bananaTwo: BananaData) {
  11. //This compiles,verifying that BananaData can be compared
  12. if bananaOne == bananaTwo { }
  13. //But BananaData is not convertible to Equatable,which is what I want
  14. let equatableBanana = bananaOne as Equatable
  15. //I don't get the additional operations added to Equatable (!=)
  16. if bananaOne != bananaTwo { } //Error
  17. }
由于错误消息说:协议的扩展不能有继承子句.相反,您可以使MyData协议在原始声明中从Equatable继承.
  1. protocol MyData: Equatable {
  2. var myDataID: Int { get }
  3. }

然后,可以扩展为符合MyData的类型添加一个==的实现:

  1. func == <T: MyData>(lhs: T,rhs: T) -> Bool {
  2. return lhs.myDataID == rhs.myDataID
  3. }

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

  1. struct SomeData: MyData {
  2. var myDataID: Int
  3. var myOtherData: String
  4. }
  5.  
  6. let b1 = SomeData(myDataID: 1,myOtherData: "String1")
  7. let b2 = SomeData(myDataID: 1,myOtherData: "String2")
  8.  
  9. b1 == b2 // true,although `myOtherData` properties aren't equal.

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

猜你在找的Swift相关文章