2015-11-02 48 views
13

我有點困惑。 protocol A : class { ... }protocol A{ ... }之間有什麼區別,我們應該使用哪一個?swift協議'弱'不能應用於非班級類型

PS:當我們寫這樣

protocol A{ ... } 

weak var delegate: A 

錯誤,我們得到了一個錯誤:「弱」無法適用於非類類型

回答

32
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

因此,一般來說,如果您需要採用協議的類型爲引用類型而不是值類型,那麼您將定義僅類別協議。

+0

在你的代碼示例中,你說''''是'let'常量'。我有點困惑。這裏「a」是什麼常數? – Suragch

+0

@Suragch:函數參數 - 作爲'func foo(a:A)'中的'a' - 默認爲* constants *。 –