Der Nil-Coalescing-Operator

Bekanntermaßen gehören Optionals zu den spannendsten und mächtigsten Sprachmerkmalen von Swift (was ich nicht müde werde zu betonen). Mit ihnen gehen auch einige technische Raffinessen einher, die sich auf den Umgang mit diesen spannenden Elementen auswirken.

Eine davon ist der sogenannte Nil-Coalescing-Operator. Seine Aufgabe ist recht simpel: Er prüft zunächst ein Optional gegen nil. Besitzt dieses einen Wert, liefert er ihn zurück, andernfalls wird auf einen Alternativwert zurückgegriffen.

Dieses Verhalten entspricht jenem, das man ansonsten typischerweise mit einer einfachen if-Abfrage löst. Man prüft zunächst, ob ein Optional ungleich nil ist, und greift in diesem Fall auf seinen Wert zu. Andernfalls nutzt man einen alternativen Wert.

Einsatzgebiet des Nil-Coalescing-Operators

Ein Beispiel für dieses Prinzip zeigt das folgende Listing. Es definiert zunächst in einer Konstanten einen Standardwert für eine zu verwendende Schriftgröße. Anschließend folgt die Deklaration einer Variablen, bei der es sich um ein Optional handelt und über die der Nutzer eine eigene Schriftgröße zur Verwendung definieren kann.

Bei der Frage, welche Schriftgröße nun aktiv im Programm genutzt werden soll, kommt eine weitere Variable namens fontSizeToUse zum Einsatz. Sollte der Nutzer eine eigene Schriftgröße gewählt haben, soll die verwendet werden, andernfalls wird auf den Standardwert zurückgegriffen.

let defaultFontSize: UInt = 12
var userDefinedFontSize: UInt?

var fontSizeToUse: UInt!
if (userDefinedFontSize != nil) {
    fontSizeToUse = userDefinedFontSize!
} else {
    fontSizeToUse = defaultFontSize
}

Praktischer Einsatz des Nil-Coalescing-Operators

Genau eine solche Konstellation – greife auf Optional zu, falls ein Wert vorhanden ist, und nutze ansonsten eine standardisierte Alternative – ist perfekt geeignet für den Nil-Coalescing-Operator. Er ist nach dem Muster <Optional> ?? <Alternative> aufgebaut und kann die gezeigte if-Abfrage im vorangegangenen Listing durch einen einzigen Befehl ersetzen. Wie das aussieht, ist im Folgenden zu sehen:

var fontSizeToUse = userDefinedFontSize ?? defaultFontSize

In diesem Swift-Code geschieht folgendes: Der neu deklarierten Variablen fontSizeToUse wird einer von zwei potentiellen Werten zugewiesen. Welcher das ist, hängt vom Optional userDefinedFontSize aus dem vorangegangenen Listing ab. Besitzt diese Variable einen Wert und entspricht somit nicht nil, wird fontSizeToUse genau jener Wert zugewiesen. Sollte userDefinedFontSize jedoch keinen Wert besitzen, wird fontSizeToUse stattdessen der Wert der Konstanten defaultFontSize zugewiesen. So oder so ist aber sichergestellt, dass fontSizeToUse nach Ausführung dieses Befehls über einen validen Wert verfügen wird.

Fazit

Der Nil-Coalescing-Operator ist eine immens spannende Sache, kann der den Umgang mit Optionals doch in bestimmten Fällen – wie dem gezeigten Beispiel – deutlich optimieren. Er verringert nicht nur die Anzahl der Befehle die nötig sind, um ein Optional auf einen Wert zu prüfen und abhängig vom Ergebnis entweder den gefundenen Wert oder eine Alternative zurückzugeben. Er macht dadurch den Code auch besser lesbar und leichter verständlich.

Eine if-Abfrage ist allgemein zur Prüfung einer Bedingung gedacht und es ist mitunter nicht sofort ersichtlich, welche Aufgaben sie insgesamt erfüllt. Beim Nil-Coalescing-Operator ist das anders. Er prüft ein Optional und liefert dessen Wert zurück (sofern es einen gibt) oder greift auf eine Alternative zu. Wenn man ihn im Code sieht, weiß man sofort, was er bezweckt. Daher sollte man in Situationen, in denen man auf den Nil-Coalescing-Operator zur Lösung eines Problem zurückgreifen kann, diesen in jedem Fall nutzen und einer – wie im ersten Listing dieses Artikels gezeigten – if-Abfrage vorziehen.

Euer Thomas


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert