2016-08-27 2 views
5

Immer wenn wir etwas mit einem optionalen Wert in swift brauchen, müssen wir es auspacken, um zu arbeiten, nicht auf dem optionalen, aber auf dem Wert "nach innen" das optionale.Geben Sie gegossene optionale Werte ein

var optionalString:String? = "Hello" 
optionalString!.append(" World!") 

Beachten Sie das Ausrufezeichen in der zweiten Zeile.

Aber wenn Sie den optionalen Typ-Operator (als?) Auf einem optionalen Wert verwenden, müssen Sie das optionale nicht auspacken, wir stellen es nur mit dem optionalen selbst zur Verfügung, und es funktioniert einfach magisch.

let sneakyString:Any? = "Hello!" 
let notSoSneakyString = sneakyString as? String 

Hinweis der abwesenden Ausrufezeichen in der zweiten Zeile.

Die Magie ist etwas deutlicher, wenn wir es buchstabieren:

let sneakyString:Any? = Optional("Hello") 
let notSoSneakyString = sneakyString as? String 

Es ist nicht eine Zeichenfolge wir versuchen, aber eine Enumeration mit einem String als assoziiertes Wert zu werfen.

Ich würde erwarten, dass ich hätte dies tun:

let sneakyString:Any? = "Hello!" 
let notSoSneakyString = sneakyString! as? String 

Hinweis auf das Ausrufezeichen in der zweiten Zeile.

Wirken die Typ-Cast-Operatoren auf Optionale und Nicht-Optionale auf die gleiche Weise?

+0

Vielleicht macht das doch Sinn. Zum Entfernen eines Nul-Optionals ist ein Laufzeitfehler erforderlich. Und wir übertragen nicht von Optional (Any) auf String, sondern von Optional (Any) auf Optional (String). – weenzeel

Antwort

1

Der Operator as? erstellt einen Cast, wenn es möglich ist, und gibt entweder das gegossene Objekt oder nil zurück. Es behandelt auch Nullwerte, so dass, wenn sneakyString Null wären, Sie nicht in der Lage gewesen wären, es auf eine String zu werfen und die Besetzung wäre fehlgeschlagen. Gleiches Verhalten, als wäre es nicht null, aber nicht umschaltbar auf String.

Mit anderen Worten, Sie brauchen die ! nicht, weil as? Nil-Werte automatisch selbst behandelt.

+0

Ja ist der Nullfall ein bisschen logischer. Bearbeitete meine Frage, um darauf hinzuweisen, dass der Operator nicht auf einer String-Struktur arbeitet, sondern auf einer Enumeration mit einer Zeichenfolge als zugehörigem Wert. Weißt du, ob das dokumentiert ist? – weenzeel

Verwandte Themen