2015-11-02 9 views
13

Ich bin ein bisschen verwirrt. Was ist der Unterschied zwischen protocol A : class { ... } und protocol A{ ... }, und welchen sollten wir in swift verwenden?Swift-Protokoll 'schwach' kann nicht auf Nicht-Klasse-Typ

PS: wir haben einen Fehler, wenn wir wie diese

protocol A{ ... } 

weak var delegate: A 

Fehler schrieben: 'schwach' kann nicht auf nicht-Klasse Typen

Antwort

32
protocol A : class { ... } 

definiert ein "class-only protocol" angewandt werden: Nur Klassentypen (und nicht Strukturen oder Aufzählungen) kann dieses Protokoll übernehmen.

Schwache Referenzen sind nur für Referenztypen definiert. Klassen sind Referenztypen, Strukturen und Aufzählungen sind Werttypen. (Verschlüsse sind auch Referenztypen, aber Verschlüsse können kein Protokoll annehmen, so dass sie in diesem Zusammenhang irrelevant sind.) Wenn Ihr Protokoll eine schwache Eigenschaft definiert, muss das Protokoll daher ein Nur-Klassen-Protokoll sein.

Hier ist ein weiteres Beispiel, das ein Klasse-only-Protokoll erfordert:

protocol A { 
    var name : String { get set } 
} 

func foo(a : A) { 
    a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant 
} 

Diese nicht kompilieren, weil für Instanzen von Strukturen und Aufzählungen, a.name = "bar" ist eine Mutation von a. Wenn Sie das Protokoll definieren als

protocol A : class { 
    var name : String { get set } 
} 

dann der Compiler weiß, dass a ist eine Instanz einer Klasse Typ dieser a ist ein Verweis auf den Objektspeicher, und a.name = "bar" modifiziert das referenzierte Objekt, aber nicht a .

Im Allgemeinen würden Sie ein Klasse-only-Protokoll definieren, wenn Sie die Typen benötigen, die das Protokoll als Referenztypen und nicht als Werttypen verwenden.

+0

In Ihrem Codebeispiel haben Sie gesagt: ''a' ist eine 'Let'-Konstante'. Ich bin ein wenig verwirrt. Was macht 'a' hier konstant? – Suragch

+0

@Suragh: Funktionsparameter - wie das 'a' in' func foo (a: A) '- sind standardmäßig * Konstanten *. –

Verwandte Themen