Swift 101 - Mit Swifts neuen optionalen Werten arbeiten

Die Programmiersprache Swift verfügt über eine neue Funktion, die als Optionals bezeichnet wird und in Objective-C bisher nicht verfügbar war. Sie ähneln optionalen Typen in Java und nullfähigen Typen in der Programmiersprache C #.

Warum Optionals verwenden?

Sie denken vielleicht "Ich kann Optionen ignorieren - eine Funktion, die ich nie verwenden werde", aber ich empfehle Ihnen, weiterzulesen. Sie werden feststellen, dass Sie in Swift optionals verwenden müssen, wenn Sie jemals einen Wert benötigen, um Null zu sein!

Mit optionalen Werten in Swift können Sie den Code präziser gestalten, indem Sie festlegen, wann ein bestimmter Wert leer sein darf (und wann nicht!). Auf diese Weise können Sie häufige Programmierfehler vermeiden, die in Ihrer App auftreten, wenn ein Fehler auftritt unerwarteter Nullwert.

Die optionalen Funktionen von Swift helfen auch dabei, den Code Ihrer App besser widerzuspiegeln, mit dem Sie bereits in Core Data angeben können, dass ein bestimmtes Entitätsattribut optional ist. Wie in Abbildung 1 gezeigt, können Sie den Typ eines Attributs (in diesem Fall String) angeben und angeben, ob der Wert optional ist.

Abbildung 1 - Sie können angeben, dass ein Core Data-Entitätsattribut optional ist.

Jetzt können Sie mit Swift dasselbe mit Ihren Eigenschaften und Variablen tun. Hier ist eine äquivalente optionale Erklärung in Swift:

var middleName: String?

Diese Deklaration erstellt eine Variable mit dem Namen middleName vom Typ String . Das Fragezeichen ( ? ) Nach dem Variablentyp " String " gibt an, dass die Variable " middleName" einen Wert enthalten kann, der entweder " String" oder " Null" sein kann . Jeder, der sich diesen Code ansieht, weiß sofort, dass middleName null sein kann . Es ist selbstdokumentierend!

Wenn Sie keinen Anfangswert für eine optionale Konstante oder Variable angeben (wie oben gezeigt), wird der Wert automatisch auf Null gesetzt . Wenn Sie möchten, können Sie den Anfangswert explizit auf null setzen:

var middleName: String? = nil

Schauen wir uns nun genauer an, wie nil in Swift verwendet wird.

nichts in Swift

Es mag auf den ersten Blick nicht offensichtlich sein, aber nur Sonderausstattungen können null sein . Wie im Apple-Buch " The Swift Programming Language " angegeben (kostenlos im iBooks Store erhältlich):

nil kann nicht mit nicht optionalen Konstanten und Variablen verwendet werden. Wenn eine Konstante oder Variable in Ihrem Code in der Lage sein muss, unter bestimmten Bedingungen mit dem Fehlen eines Werts fertig zu werden, deklarieren Sie diesen immer als optionalen Wert des entsprechenden Typs.

Dies bedeutet, dass Sie so etwas nicht tun können, da die Variable firstName nicht mit einem Fragezeichen markiert ist, um anzuzeigen, dass es sich um eine optionale Variable handelt:

var firstName: String = nil

Dieser Code erzeugt den folgenden Fehler bei der Kompilierung:

Typ 'String' entspricht nicht dem Protokoll 'NilLiteralConvertible' .

Es ist auch wichtig anzumerken, dass nil in Swift anders ist als nil in Objective-C. In Objective-C ist nil ein Zeiger auf ein nicht vorhandenes Objekt. In Swift gibt nil einfach das Fehlen eines Werts an - es ist kein Zeiger. Dies bedeutet, dass Sie Optionen eines beliebigen Typs angeben können, nicht nur Objekttypen.

Zugriff auf optionale Werte

Im Gegensatz zu anderen Programmiersprachen können Sie in Swift nicht direkt auf einen optionalen Wert zugreifen . Sie müssen die Option zuerst auspacken, um auf den zugrunde liegenden Wert zuzugreifen. Nehmen Sie zum Beispiel den folgenden Code:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

Die ersten drei Codezeilen deklarieren eine Zeichenfolgenvariable firstName, eine optionale Zeichenfolgenvariable middleName und eine Zeichenfolgenvariable firstAndMiddleNames . Die nächste Codezeile verknüpft die Variablenwerte firstName und middleName mit einem Leerzeichen dazwischen. Es kann Sie überraschen, dass diese Codezeile den folgenden Fehler beim Kompilieren verursacht:

Wert des Optionstyps 'String?' nicht ausgepackt; Wollten Sie '!' oder '?'?

Dies ist einer von Swifts Schutzmechanismen. Es zwingt Sie anzuerkennen, dass ein Wert möglicherweise Null ist . Also, wie packt man ein optionales aus? Es gibt zwei Hauptmethoden, die in den folgenden Abschnitten beschrieben werden.

Verwenden des erzwungenen Auspackens für Sonderzubehör

Wie durch den Compilerfehler im vorherigen Abschnitt vorgeschlagen, besteht eine Möglichkeit, einen optionalen Wert zu dekomprimieren, darin, das Ausrufezeichen (!) Nach dem optionalen Wert zu verwenden, um ihn explizit zu dekomprimieren. Zum Beispiel:

firstAndMiddleNames = firstName + " " + middleName!

Dies erzwingt manuell, dass der Wert von middleName optional entpackt wird . Wenn middleName jedoch zur Laufzeit eine Null enthält, wird dies einen EXC_BAD_INSTRUCTION- Laufzeitfehler erzeugen. Offensichtlich möchten Sie kein erzwungenes Auspacken verwenden, es sei denn, Sie sind sich absolut sicher, dass der Wert nicht null ist .

Optionale Bindung zum Auspacken von Optionen verwenden

Sie können eine als optionale Bindung bekannte Technik verwenden, um zu testen, ob eine Option einen Wert enthält, und diesen Wert in einer temporären Variablen oder Konstanten zu speichern. Sehen Sie sich diesen Code an, um zu zeigen, wie dies in unserem vorherigen Beispiel funktioniert:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

if let middle = middleName

{

firstAndMiddleNames = firstName + "" + middle

}

sonst

{

firstAndMiddleNames = firstName

}

Wenn die if- Bedingung zur Laufzeit überprüft wird und die middleName- Variable einen String- Wert enthält, wird die Bedingung als true ausgewertet, der in der middleName- Variable enthaltene Wert wird umbrochen, in der mittleren Konstante und im Code in geschweiften Klammern der if- Anweisung gespeichert ausgeführt wird.

Wenn die Variable middleName nil enthält, wird die Bedingung als false ausgewertet, der optionale Wert wird nicht umbrochen, und der Code in den geschweiften Klammern der else- Anweisung wird ausgeführt.

Implizit ausgepackte Optionals

Swift hat auch so etwas wie implizit ausgepackte Optionen. Hierbei handelt es sich um optionale Elemente, die weder durch erzwungenes Auspacken (!) Noch durch optionale Bindung ausgepackt werden müssen, da sie implizit (automatisch) ausgepackt werden. Sie werden mit einem Ausrufezeichen (!) Und nicht mit einem Fragezeichen (?) Deklariert.

Beim Arbeiten mit Interface Builder-Ausgängen ( IBOutlet- Eigenschaften) werden häufig implizit ausgepackte Optionen angezeigt . Zum Beispiel:

@IBOutlet weak var lblDescription: UILabel!

In diesem Code ist die Eigenschaft lblDescription outlet mit einem Ausrufezeichen versehen, das darauf hinweist, dass sie implizit entpackt ist. Auf diese Weise können Sie auf die Eigenschaft zugreifen, ohne sie auspacken zu müssen.

In diesem Beispiel kann nicht garantiert werden, dass die Eigenschaft outlet einen Verweis auf ein Label enthält, dies sollte jedoch unbedingt der Fall sein . Wenn es keinen Verweis auf ein Etikett enthält, bedeutet dies, dass die Verbindung zwischen der Steckdose und dem Etikett unterbrochen wurde. In diesem Fall kann ein Laufzeitfehler auftreten, da Sie wissen möchten, dass die Verbindung unterbrochen ist, damit Sie ihn beheben können.

In Fällen, in denen Sie nicht zu 100 Prozent sicher sind, dass eine Konstante oder Variable einen Wert enthält, sollten Sie natürlich stattdessen ein reguläres optionales Element verwenden.

Fazit

Optionals sind eine großartige neue Funktion von Swift, mit der Sie keine Werte in Ihren iOS-Apps sicher verarbeiten können. Ich empfehle, diesen Beitrag ein paar Mal zu lesen, um sicherzugehen, dass Sie die grundlegenden Konzepte verstehen, und dann zum Buch The Swift Programming Language von Apple zurückzukehren, um mehr über die Verwendung von Optionen in Swift zu erfahren.