Swift中protocol to inherit from class关键字是什么意思?

In Swift, what does it mean for protocol to inherit from class keyword?

在Swift中,协议继承自class关键字是什么意思?

例如

protocol MyDelegate: class {

}

来自Apple docs:

You can limit protocol adoption to class types (and not structures or enumerations) by adding the class keyword to a protocol’s inheritance list.

示例:

protocol AProtocol: class {   
}

//Following line will produce error: Non-class type 'aStruct' cannot conform to class protocol 'AProtocol'
struct aStruct: AProtocol { 
}

声明结构的那一行会吐出一个错误。以下行将产生错误:

Non-class type 'aStruct' cannot conform to class protocol 'AProtocol'

的要点是正确的,但它遗漏了 为什么 我认为这里很重要。归结为 ARC 和内存管理。

Swift是引用类型和值类型的语言。 是引用类型,而其他一切都是值类型。实际上,我们并没有真正指定协议 class 继承 ...更像是我们指定协议只能由 [=34= 实现]引用类型.

为什么这很重要?

这很重要,因为没有它,我们就不能在协议中使用 weak 关键字。

protocol ExampleProtocol {}

class DelegatedClass {
    weak var delegate: ExampleProtocol?
}

这会产生错误:

'weak' cannot be applied to non-class type 'ExampleProtocol'

为什么不呢?因为 weak 关键字只对应用 ARC 的引用类型有意义。 ARC 不适用于值类型。如果不使用 class 指定我们的协议,我们不能保证我们的 delegate 属性 设置为引用类型。 (如果我们不使用 weak,我们很可能会创建一个保留循环。)