在Swift中,协议从类关键字继承是什么意思?
e.g。
protocol MyDelegate: class {
}
答案 0 :(得分:14)
Starscream's answer的要点是正确的,但它错过了为什么我觉得这里很重要。它归结为ARC和内存管理。
Swift是引用类型和值类型的语言。 Classes 是引用类型,而其他所有内容都是值类型。实际上,我们并未真正指定协议从class
继承 ...它更像是我们指定协议只能实施通过引用类型。
为什么这很重要?
这很重要,因为没有它,我们无法在协议中使用weak
关键字。
protocol ExampleProtocol {}
class DelegatedClass {
weak var delegate: ExampleProtocol?
}
这会产生错误:
'弱'不能应用于非类型' ExampleProtocol'
为什么不呢?因为weak
关键字仅适用于ARC适用的引用类型。 ARC不适用于值类型。如果没有使用class
指定我们的协议,我们无法保证我们的delegate
属性设置为引用类型。 (如果我们不使用weak
,我们很可能会创建一个保留周期。)
答案 1 :(得分:4)
您可以将协议采用限制为类类型(而不是结构或类型) 枚举)通过将class关键字添加到协议的继承 列表。
示例:
protocol AProtocol: class {
}
//Following line will produce error: Non-class type 'aStruct' cannot conform to class protocol 'AProtocol'
struct aStruct: AProtocol {
}
声明结构的行会吐出错误。以下行将产生错误:
非班级类型“
aStruct
”无法符合班级协议“AProtocol
”