protocol的两种形式:
1,protocol A { }
2,protocol A : class { }
首先说 protocol A : class { } 这种形式被称为class-only protocol,只有类(不包括结构体、枚举)能遵循该协议。
弱引用只用在引用类型中。类(class)是引用类型,结构体和枚举是值类型。闭包也是引用类型,但是闭包不能遵循协议,所以他们于此无关。
另外,如果一个遵循协议的对象需要用到弱引用属性来存储,该协议必须是一个class-only协议。
这里有一个需要用到class-only的例子:
protocol A {
var name: String { get set }
}
func foo(a : A) {
a.name = "bar" //error:cannot assign to property: 'a' is a 'let' constant
}
以上是编译不通过的因为对结构体和枚举的实例来说,a.name = "bar" 是对 a 的改变。 如果你像下面这样定义协议:
protocol A : class {
var name : String { get set }
}
这样编译器就会知道 a 是一个类的实例,即为: a 是一个对象存储的引用,a.name = "bar" 改变的是引用的对象,而不是改变的 a 。
所以通常的,如果你需要一个类型遵循协议来当做引用类型而不是值类型,你将会用class-only protocol。