TEAM LICENSES: Save money and learn new skills through a Hacking with Swift+ team license >>

Optional Chaining

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.

Der Nil Coalescing Operator

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.

Hacking with Swift is sponsored by Blaze.

SPONSORED Still waiting on your CI build? Speed it up ~3x with Blaze - change one line, pay less, keep your existing GitHub workflows. First 25 HWS readers to use code HACKING at checkout get 50% off the first year. Try it now for free!

Reserve your spot now

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

Average rating: 4.0/5

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.