为什么在Swift中使用仅类协议?

时间:2014-12-18 19:15:38

标签: swift ios8 protocols

任何人都可以在Swift中向我解释只有类的协议。我了解协议是什么以及我们使用它们的原因。我也理解,当我们在其中使用引用类型对象时,建议使用仅类协议,并且希望仅将协议构造限制为类。但是,我找不到支持该建议的任何好答案。为什么推荐?在这种情况下使用普通协议有什么缺点。

2 个答案:

答案 0 :(得分:7)

一个用例:

  • 您有一个“委托”协议,有人希望拥有该协议类型的weak属性。 weak只能用于引用类型;因此,协议必须是仅限类的。

答案 1 :(得分:0)

另一个用于用于扩展引用类型以采用协议的用例。您无法扩展AnyObject本身(以从其他协议继承,或出于任何其他原因),但是您想要使用从AnyObject继承的协议的任何引用类型。

例如,基于唯一身份进行类相等通常是一个很好的解决方案,因此您可以采用EquatableObject

public protocol EquatableObject: AnyObject, Equatable { }

public extension EquatableObject {
  static func == (class0: Self, class1: Self) -> Bool {
    class0 === class1
  }
}

但是,现在,我们有了协议扩展约束(使用where子句),因此我们可以扩展协议并将AnyObject用作约束,而不是扩展AnyObject。它向后看,但操作方式相同,因此不需要我们自己的协议。 ?

public extension Equatable where Self: AnyObject {
  static func == (class0: Self, class1: Self) -> Bool {
    class0 === class1
  }
}