Das Arbeiten mit Optionals kann sich manchmal etwas schwerfällig anfühlen und das ständige entpacken und überprüfen kann so lästig werden, dass man schnell dazu neigt, hier und da ein paar Ausrufezeichen (force unwrap) zu verteilen, um sich das Leben leichter zu machen. Aber Vorsicht: Wenn man ein Optional force unwrapped, es aber keinen Wert zum entpacken gibt, wird dein Programm abstürzen!
Swift bietet zwei Techniken um deinen Code zu vereinfachen. Die erste nennt sich Optional Chaining. Diese führt deinen Code nur aus, wenn dein Optional einen Wert hat. Kopiere den folgenden Code in deinen Playground und lass uns starten:
func albumReleased(year: Int) -> String? {
switch year {
case 2006: return "Taylor Swift"
case 2008: return "Fearless"
case 2010: return "Speak Now"
case 2012: return "Red"
case 2014: return "1989"
default: return nil
}
}
let album = albumReleased(year: 2006)
print("The album is \(album)")
Es wird "The album is Optional("Taylor Swift")" im Ausgabebereich angezeigt.
Wenn wir den Rückgabewert von albumReleased()
in Großbuchstaben haben wollen (also "TAYLOR SWIFT" anstatt "Taylor Swift") können wir die uppercased()
Methode des Strings aufrufen. Wie in diesem Beispiel:
let str = "Hello world"
print(str.uppercased())
Das Problem ist, dass albumReleased()
einen Optional String zurückgibt: es kann also einen String enthalten oder auch nichts. Was wir also wirklich möchten ist: "wenn wir einen String zurückbekommen, dann schreibe diesen bitte in Großbuchstaben. Andernfalls mach einfach nichts."
Und hier kommt Optional Chaining ins Spiel, denn es bietet genau dieses Verhalten.
Ändere die beiden letzten Zeilen in deinem Playground wie folgt:
let album = albumReleased(year: 2006)?.uppercased()
print("The album is \(album)")
Siehst du das Fragezeichen? Das ist Optional Chaning: alles nach dem Fragezeichen wird nur ausgeführt, wenn alles davor einen Wert hat.
Dies hat keinen Einfluss auf den Datentyp von album
, denn jetzt wird entweder nil oder der Albumname in Großbuchstaben zugewiesen. Es ist also immer noch ein Optional String.
Die Optional Chain kann so lang sein, wie man sie braucht. Beispielsweise:
let album = albumReleased(year: 2006)?.someOptionalValue?.someOtherOptionalValue?.whatever
Swift überprüft die Werte von links nach rechts, bis es nil findet. Hier wird die weitere Überprüfung abgebrochen.
Dieses Swift Feature macht deinen Code einfacher und sicherer und hat trotzdem einen so "grandiosen" Namen, dass viele Leute davon abgeschreckt werden. Das ist schade, denn der Nil Coalescing Operator kann die Sache wesentlich vereinfachen, wenn man verstanden hat wie.
Mit ihm lässt sich folgendes Verhalten abbilden: "wenn möglich, benutze den Wert A, wenn A aber nil ist, benutze den Wert B". Dies ist insbesondere bei der Arbeit mit Optionals hilfreich. Durch die Bereitstellung eines Standardwerts, ist es nämlich kein Optional mehr. Wenn also A ein Optional ist und einen Wert enthält, wird A verwendet und wir haben einen Wert. Wenn A nil ist, wird B verwendet und auch jetzt haben wir einen Wert. So oder so, wir haben immer einen Wert.
Um das mal auf unser Beispiel oben anzuwenden, ersetze den Code im Playground wie folgt:
let album = albumReleased(year: 2006) ?? "unknown"
print("The album is \(album)")
Das doppelte Fragezeichen kennzeichnet den Nil Coalescing Operator, welcher in diesem Beispiel folgendes aussagt: "wenn albumReleased()
einen Wert hat, weise diesem der Konstante album zu. Wenn albumReleased()
aber nil zurückgibt, weise album den Wert "unknown" zu"
Wenn du nun auf den Ausgabebereich schaust, wird dort "The album is Taylor Swift" ausgegeben. Dies passiert, weil Swift nun sicher sein kann, dass immer ein echter Wert vorhanden ist und es kein Optional mehr braucht, da die Funktion entweder einen Wert liefert oder der Wert auf "unknown" gesetzt wird. Das wiederum heißt, man muss nichts entpacken und riskiert keine Abstürze. Es gibt garantiert einen Wert mit dem gearbeitet werden kann, was deinen Code sicherer macht und leichter zu pflegen.
SAVE 50% All our books and bundles are half price for Black Friday, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.
Link copied to your pasteboard.