1。
protocol A: AnyObject { }
2。
protocol A { }
我知道case 1
可以限制类类型
但是,为什么要限制类类型?
答案 0 :(得分:2)
AnyObject
要求符合类型是类,而不是结构或枚举。有关详细信息,请参见Class-Only Protocols。
类提供参考语义,而不是值语义,这可能是您的协议所必需的。例如,如果要观察对象,则仅对引用类型有意义(您不能观察对值类型的更改,因为值类型在修改时被复制)。有关详细信息,请参见Structures and Classes,尤其是解释值和引用类型的部分。
没有等于AnyObject
的值类型。您可以不需要协议的值语义。这可能会导致一些头痛。作为区别的示例,请考虑以下几点:
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中没有真正的解决方案。