In dieser Artikelreihe stelle ich Ihnen verschiedene Features der modernen Programmiersprache Swift vor. In meinen Augen und meiner persönlichen Erfahrung nach werden diese Features nicht oft in aktuellen Swift-Projekten eingesetzt, obwohl sie es verdient hätten.

Ich werde die bisher noch unbekannten Vorteile und Einsatzszenarien der Swift-Features in der Artikelreihe vorstellen. Im ersten Teil der Reihe stelle ich Ihnen die sogenannten Tuples 27 vor und erkläre wie Sie mit deren Hilfe zusammengehörige Werte in einem einzigen zusammengesetzten Wert gruppieren können. Viel Spaß beim Lesen.

Darum wird es gehen:

Werdet eins, oder: Das Problem, das Tuples lösen

Swift ist als enorm typischere Sprache ausgelegt. Jede Variable und Konstante, jeder Methodenparameter und -rückgabewert entspricht einem ganz speziellen Typ. Möchte man jedoch mehrere zusammengehörige Werte zusammenfassen, bringt einen dieses Konzept schnell an seine Grenzen.

Ein Beispiel: Möchte man einen HTTP-Status-Code mit Nummer (als Integer) und Beschreibung (als String) abbilden, müsste man eigentlich beide Informationen in separaten Objekten speichern und unabhängig voneinander behandeln. Dabei würde es Sinn machen, diese beiden Informationen – zumindest temporär – zusammenzufassen.

Natürlich könnte man einen eigenen Typ – beispielsweise in Form einer Structure – erstellen, um darüber diese beiden zusammengehörigen Informationen miteinander zu verbinden, doch erscheint das für einen Fall wie dem genannten Beispiel eines HTTP-Status-Codes als ein wenig übertrieben. Und genau hier kommen die sogenannten Tuples ins Spiel!

Mithilfe eines Tuples können Sie beliebige Werte in einem neuen Wert zusammenfassen. In unserem Beispiel wäre es so möglich, einen HTTP-Status-Code mitsamt zugehöriger Beschreibung direkt in einen einzigen passenden Wert zu stecken – ohne dafür extra einen eigenen Typ kreieren zu müssen.

Funktionsweise und Syntax von Tuples

Um ein neues Tuple-Element zu erstellen, fassen Sie die Werte, die zusammengehören, innerhalb runder Klammern zusammen und trennen sie nacheinander durch ein Komma.

Ein einfaches Beispiel auf Basis des beschriebenen HTTP-Status-Code-Szenarios zeigt das folgende Listing:

var httpStatusCode = (404, "Not Found")

Hierdurch entsteht ein völlig neuer Typ mit der Bezeichnung (Int, String). Die runden Klammern deuten auf ein Tuple hin, während die durch Komma getrennten Typen innerhalb der runden Klammern angeben, welche Werte an der jeweiligen Position erlaubt sind. So können Sie den Wert der zuvor deklarierten Variablen httpStatusCode beispielsweise wie folgt ändern:

httpStatusCode = (200, "OK")

Es ist wichtig, innerhalb des Tuples immer eine Instanz des korrekten Typs zu setzen. In diesem Beispiel muss zunächst ein Integer und anschließend ein String übergeben werden; hier gibt es keinerlei Spielraum für ein alternatives Vorgehen. Entsprechend würde der folgende Befehl auch direkt zu einem Compiler-Fehler führen:

// Error: Cannot assign value of type '(String, Int)' to type '(Int, String)'
httpStatusCode = ("OK", 200)

Der Typ der Variablen httpStatusCode ist (Int, String), doch hier wurde versucht, ihr einen Wert des Typs (String, Int) zuzuweisen. Da diese beiden Typen verschieden sind, greift hier die Typsicherheit von Swift und verhindert eine entsprechende Zuweisung.

Zugriff auf die Werte eines Tuple

Wie wir gesehen haben, setzt sich ein Tuple aus mehreren verschiedenen Werten beliebiger Typen zusammen. Um aber vernünftig mit diesem Element arbeiten zu können, ist es notwendig, auf die einzelnen Werte innerhalb eines Tuple zugreifen zu können. Nehmen wir beispielsweise an, wir verfügen über eine Methode, die als Parameter einen HTTP-Status-Code als Integer erwartet, sich aber nicht für die zugehörige Beschreibung in Form eines Strings interessiert. Wollen wir eine solche Methode auf Basis unserer httpStatusCode-Variablen aufrufen, müssen wir den Status-Code daraus explizit auslesen.

Hierzu kommen bei Tuples standardmäßig Indexe zum Einsatz, die mit dem Wert 0beginnen. Über den Index 0 können wir demnach den Status-Code als Integer unserer httpStatusCode-Variablen auslesen, während uns der Index 1 die zugehörige Beschreibung als String zurückliefert. Der Index wird hierbei wie beim Zugriff auf eine Property oder Methode nach dem Namen des Tuples, getrennt durch einen Punkt, angegeben.

Das folgende Listing soll die Verwendung solcher Indexe verdeutlichen, indem die beiden Werte in httpStatusCode nacheinander auf der Konsole ausgegeben werden:

print("Status-Code: \(httpStatusCode.0)")
print("Beschreibung: \(httpStatusCode.1)")
// Status-Code: 200
// Beschreibung: OK

Werte benennen

Gerade wenn man ein Tuple mit vielen Elementen erstellt, kann sich der Zugriff auf die einzelnen Werte mithilfe eines Index womöglich als unübersichtlich und schwer lesbar gestalten. Woher soll man schließlich wissen, was eine Aussage wie httpStatusCode.0 bedeutet?

Abhilfe schafft hier die Möglichkeit, die Werte eines Tuple zu benennen. Dazu stellt man schlicht den einzelnen Werten des Tuple, die innerhalb der runden Klammern zusammengefasst werden, einen gewünschten Bezeichner voran, gefolgt von einem Doppelpunkt. Das folgende Beispiel demonstriert eine solche Deklaration inklusive Aufruf der jeweiligen Werte des Tuple:

var anotherHTTPStatusCode = (statusCode: 200, descriptioin: "OK")
print("Status-Code: \(anotherHTTPStatusCode.statusCode)")
print("Beschreibung: \(anotherHTTPStatusCode.descriptioin)")

Der erste Wert des Tuple – der HTML-Status-Code – kann nun über den konkreten Bezeichner statusCode angesprochen werden, während die Beschreibung mittels description abgerufen werden kann.

Wo die Grenzen liegen – FAZIT

Tuples eignen sich perfekt, um zusammenhängende Werte schnell und einfach zu gruppieren. Allerdings sollten sie nicht dazu missbraucht werden, komplexe Datenstrukturen abzubilden; dafür gibt es Strukturen und Klassen in Swift, die damit deutlich besser und performanter umgehen können. Dank Tuples aber können beispielsweise Methoden in Swift mehr als einen Rückgabewert besitzen und – wie am Beispiel des HTTP-Status-Codes gezeigt – im Zusammenhang stehende Werte übersichtlich gruppiert werden.

Tuble in Swift programmieren für Eilige