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

时间:2015-08-20 12:30:34

标签: swift protocols

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

e.g。

protocol MyDelegate: class {

}

2 个答案:

答案 0 :(得分:14)

Starscream's answer的要点是正确的,但它错过了为什么我觉得这里很重要。它归结为ARC和内存管理。

Swift是引用类型和值类型的语言。 Classes 是引用类型,而其他所有内容都是值类型。实际上,我们并未真正指定协议class继承 ...它更像是我们指定协议只能实施通过引用类型

为什么这很重要?

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

protocol ExampleProtocol {}

class DelegatedClass {
    weak var delegate: ExampleProtocol?
}

这会产生错误:

  

'弱'不能应用于非类型' ExampleProtocol'

enter image description here

为什么不呢?因为weak关键字仅适用于ARC适用的引用类型。 ARC不适用于值类型。如果没有使用class指定我们的协议,我们无法保证我们的delegate属性设置为引用类型。 (如果我们不使用weak,我们很可能会创建一个保留周期。)

答案 1 :(得分:4)

来自Apple docs:

  

您可以将协议采用限制为类类型(而不是结构或类型)   枚举)通过将class关键字添加到协议的继承   列表。

示例:

protocol AProtocol: class {   
}

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

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

  

非班级类型“aStruct”无法符合班级协议“AProtocol