Swift -- protocol 'weak' cannot be applied to non-class type報錯

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。

參考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章