SALE ENDS TODAY: Save 50% on all Swift books and bundles! >>

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.

SPONSORED Instabug helps you identify and resolve severe crashes quickly. You can retrace in-app events and know exactly which line of code caused the crash along with environment details, network logs, repro steps, and the session profiler. Ask more questions or keep users up-to-date with in-app replies straight from your dashboard. Instabug takes data privacy seriously, so no one sees your data but you! See more detailed features comparison and try Instabug's crash reporting SDK for free.

Save 50% on all books and bundles

The biggest ever Hacking with Swift sale is now on, letting you save 50% on all books and bundles. Learn something new with Swift and enjoy great savings while the sale lasts!

Click here to save 50% in our Black Friday sale!

BUY OUR BOOKS
Buy Pro Swift 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 (Vapor Edition) 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 Server-Side Swift (Kitura Edition) Buy Beyond Code

Was this page useful? Let us know!