2016-07-25 10 views
3

Ich weiß, was das? wird als Operator verwendet, aber was bedeutet es, wenn es sich um einen Typ handelt?Swift ?? auf einem Typ

Ich habe eine Struktur in meinem Projekt MyStruct und die automatische Vervollständigung eines bestimmten var genannt sagt mir, es ist vom Typ MyStruct??

Nicht wirklich sicher, was das bedeutet oder wie es sicher auszupacken.

+6

Es ist 'Optional >', ein "optional optional MyStruct". –

+3

Verschachtelte Optionals: 'Optional (Optional (Wert))'. Zweimal auspacken. – Moritz

+0

Typisches Beispiel 'UIApplicationDelegate.window', eine optionale Eigenschaft, die ein enthalten kann Optional: Oder indizieren Sie ein optionales Wörterbuch: – Sulthan

Antwort

4

Wie andere gesagt haben, ist es eine doppelte Optional, völlig unabhängig von der Null Koaleszenz-Operator (??).

es auszupacken, auszupacken Sie nur eine regelmäßige optional, zweimal:

let doubleOptional: MyStruct?? = MyStruct() 

guard let singleOptional = doubleOptional else { 
    //first unwrapping failed 
} 

guard let wrappedValue = singleOptional else { 
    //second unwrapping failed 
} 

//use wrappedValue 

Diese recht selten sind, aber es gibt Zeiten, wenn sie nützlich sind.

Betrachten Sie zum Beispiel eine Datenstruktur, die den Durchschnitt eines Arrays speichert. Das Array ist möglicherweise leer, daher sollte der Durchschnittswert nil lauten, um anzuzeigen, dass kein Durchschnitt vorhanden ist. Angenommen, der Durchschnittswert ist sehr teuer und wir möchten ihn in einer Cache-Schicht speichern. Diese Caching-Ebene könnte eine doppelte Option haben, die diesen Durchschnitt darstellt. Wenn der Wert Optional.None ist (d. H. nil), wissen wir, dass der Cache noch keinen Wert hat, daher muss er berechnet werden. Wenn der Wert Optional.Some(Optional.None) ist, wissen wir, dass der Cache einen Wert hat, aber dass es keinen gültigen Durchschnitt gibt (dh das Array war leer. Schließlich könnte der Wert Optional.Some(Optional.Some(/*...*/)) sein, was einen gültigen Cachespeicherwert eines gültigen Durchschnitts darstellt.

+1

Danke. Macht Sinn, wenn Sie darüber nachdenken. Ich habe eine Aufgabe, die einen Fehler zurückgeben oder ein Ergebnis zurückgeben kann. Dieses Ergebnis kann einen Wert haben oder null sein. Also das Ergebnis ist ??. Sortiert jetzt sowieso. Danke – Fogmeister

+0

Es ist besser, Fehler zu werfen, als sie zurückzugeben. – Alexander

+0

Es ist Teil eines Netzwerk-Framework. Die Fehler sind Serverfehler, die an einen Abschlussblock zurückgegeben werden. Würde es anders machen. – Fogmeister