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。