无`之间的区别协议的`:AnyObject`有什么区别?

时间:2019-09-25 14:18:06

标签: swift

1。

protocol A: AnyObject { }

2。

protocol A { }

我知道case 1可以限制类类型

但是,为什么要限制类类型?

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中没有真正的解决方案。