13
我有點困惑。 protocol A : class { ... }
和protocol A{ ... }
之間有什麼區別,我們應該使用哪一個?swift協議'弱'不能應用於非班級類型
PS:當我們寫這樣
protocol A{ ... }
weak var delegate: A
錯誤,我們得到了一個錯誤:「弱」無法適用於非類類型
我有點困惑。 protocol A : class { ... }
和protocol A{ ... }
之間有什麼區別,我們應該使用哪一個?swift協議'弱'不能應用於非班級類型
PS:當我們寫這樣
protocol A{ ... }
weak var delegate: A
錯誤,我們得到了一個錯誤:「弱」無法適用於非類類型
protocol A : class { ... }
定義"class-only protocol":只有類類型(而不是結構或枚舉)可以採用這個協議。
弱引用僅定義爲引用類型。類 是引用類型,結構和枚舉是值類型。 (閉包也是參考類型,但閉包不能採用 協議,所以它們在這種情況下無關。)因此,如果您的 協議定義了弱屬性,那麼該協議必須是 類專用協議。
這裏是這需要一個唯一的類的協議的另一個示例:
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
。
因此,一般來說,如果您需要採用協議的類型爲引用類型而不是值類型,那麼您將定義僅類別協議。
在你的代碼示例中,你說''''是'let'常量'。我有點困惑。這裏「a」是什麼常數? – Suragch
@Suragch:函數參數 - 作爲'func foo(a:A)'中的'a' - 默認爲* constants *。 –