1.
protocol A: AnyObject { }
2.
protocol A { }
我知道case 1
可以限制class-type
但是,我为什么要限制类类型?
最佳答案
AnyObject
要求符合类型是类,而不是结构或枚举。参见 Class-Only Protocols了解详情。
类提供引用语义,而不是您的协议(protocol)可能需要的值语义。例如,如果你想观察一个对象,那只对引用类型有意义(你不能观察值类型的变化,因为值类型在修改时被复制)。有关更多详细信息,请参阅 Structures and Classes ,尤其是解释值和引用类型的部分。
没有与 AnyObject
等效的值类型。您不能要求协议(protocol)具有值语义。这可能会导致一些头痛。作为差异的示例,请考虑以下内容:
protocol Incrementing {
var value: Int { get set }
}
extension Incrementing {
func incremented() -> Self {
var new = self // Value types copy, reference types reference
new.value += 1
return new
}
}
struct S: Incrementing { var value: Int = 0 }
class C: Incrementing { var value: Int = 0 }
var s = S()
s.incremented().value // 1
s.value // 0
var c = C()
c.incremented().value // 1
c.value // 1 (!!!)
这段代码对结构有意义,但对类来说是错误的。目前在 Swift 中还没有真正解决这个问题。
关于swift - 协议(protocol)的 `: AnyObject` 和 `none` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58100535/