2015-12-20 6 views
35

Ich habe Zweifel über Protokolle in Swift über die Verwendung von var und die Schlüsselwörter {get set}.Warum kann ich kein Protokoll in Swift verwenden?

Von Apple documentation:

Wenn ein Protokoll eine Eigenschaft erfordert gettable und einstellbar sein, dass Eigenschaft Anforderung kann nicht durch eine Konstante gespeichert Eigenschaft oder eine schreibgeschützte berechnete Eigenschaft erfüllt werden. Wenn das Protokoll nur eine Eigenschaft benötigt, um gettable zu sein, kann die Anforderung von jeder Art der Eigenschaft erfüllt werden, und es ist gültig für die Eigenschaft auch einstellbar, wenn dies für Ihren eigenen Code nützlich ist.

Eigenschaftenanforderungen werden immer als Variableneigenschaften mit dem Schlüsselwort var, , deklariert. Getable und setzbare Eigenschaften sind angezeigt durch Schreiben {Get Set} nach ihrer Typdeklaration, und gettable Eigenschaften werden durch Schreiben {get} angezeigt.

Ich kann nicht verstehen, warum ich nicht lassen kann. A var in einem Protokoll mit nur Get ist nicht nur ein lassen?

Etwas wie folgt aus: Ich vermisse

protocol someProtocol 
{ 
    let someProperty: String 
} 

etwas:

protocol someProtocol 
{ 
    var someProperty: String { get } 
} 

es nicht nur sein würde?

+4

Eine getable-Eigenschaft kann noch Werte ändern - der Protokollimplementierer kann immer unterschiedliche Werte zurückgeben, der Protokollaufrufer kann sie einfach nicht setzen. Auf der anderen Seite, definieren Sie eine Konstante. Es kann nur einmal eingestellt werden und kann keinen anderen Wert haben. – pvg

+1

@pvg, warum hast du das nicht als Antwort gepostet? – courteouselk

+0

yup, das ist die richtige Antwort hier. – sunshinejr

Antwort

35

"Eine Var in einem Protokoll mit nur bekommen ist nicht nur ein Let?" Nr. A let zeigt eine Konstante an. Aber das ist hier nicht der Fall. Beachten Sie Folgendes:

protocol SomeProtocol { 
    var someProperty: String { get } 
} 

class SomeClass : SomeProtocol { 

    var someProperty: String = "" 

    func cla() { 
     someProperty = "asd" 
    } 
} 

let someInstance = SomeClass() 

print(someInstance.someProperty) // outputs "" 
someInstance.cla() 
print(someInstance.someProperty) // outputs "asd" 

Das Protokoll, was die Conforming Klasse zeigt nach außen gibt - eine Eigenschaft des Typs String namens someProperty dem Sie mindestens bekommen.

Wenn das Protokoll { get } angibt, kann Ihre Klasse wählen, über let someProperty: String = "" zu entsprechen, aber es kann in ähnlicher Weise wählen, über den obigen Code zu entsprechen. Wenn das Protokoll andererseits { get set } spezifiziert, können Sie let nicht in der Implementierung verwenden, sondern müssen es auch einstellbar machen.

Ein Protokoll kann einfach nicht definieren, dass ein Wert konstant sein muss - auch nicht, das ist ein Implementierungsdetail, das von der Klasse/Struktur, die es implementiert, beachtet (oder entschieden) werden muss.

+0

Rückblickend war es so einfach und offensichtlich, in Protokollen sind nur Funktionen erlaubt (dann Eigenschaften), aber ich bevorzuge immer fragen und alle Zweifel zu lösen; jetzt die Verwendung von '{Get Set}' es ist klar wie immer, nochmals vielen Dank! –

21

Der Unterschied ist zwischen

protocol MyProtocol { 
    let someProperty: String 
} 

, die keinen Sinn macht - ein Protokoll nicht diktieren soll, wiesomeProperty definiert ist/gespeichert, nur dass es als Eigenschaft verfügbar ist. Es könnte entweder eine berechnete oder eine gespeicherte Eigenschaft sein, aber das muss der Implementierer entscheiden, nicht das Protokoll selbst.

und

protocol MyProtocol { 
    var someProperty: String { get } // abstract interface 
} 

struct MyStruct: MyProtocol { 
    let someProperty: String // concrete implementation: stored property 
} 

struct OtherStruct: MyProtocol { 
    let i: Int 
    var someProperty: String { return "\(i)" } // concrete implementation: computed property 
} 

, die perfekt ist erlaubt!

Verwandte Themen