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

4

请问有人能够用Swift向我解释仅限类的协议吗?我理解什么是协议以及我们为什么要使用它们。我也明白当我们在协议中使用引用类型对象并希望将协议实现限制在类中时,推荐使用仅限类的协议。然而,我找不到任何好的答案来支持这一建议。为什么要推荐使用它呢?如果使用普通协议会有什么缺点呢?


3
当一个协议所定义的行为假设或要求符合类型具有引用语义而不是值语义时,请使用仅类(class-only)协议。 - Robert Harvey
2个回答

11

一个使用场景:

  • 你有一个“delegate”协议,有人想要拥有该协议类型的weak属性。weak只能用于引用类型;因此,该协议必须是仅类。

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
  }
}

为什么在这种情况下需要使用“where Self: AnyObject for Equatable”?仅使用Equatable不足吗? - user14357314
值类型不支持 === 运算符。 - user652038
请问您能否分享一下关于值类型的同版本扩展或者链接呢? - user14357314
1
阅读此页面,它是自动合成的。https://developer.apple.com/documentation/swift/equatable - user652038

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接