Technologische Neuigkeiten, Bewertungen und Tipps!

Tupel in Swift erklärt

Hinweis: Der folgende Artikel hilft Ihnen weiter: Tupel in Swift erklärt

Zurück zum Blog

Sie verwenden Tupel in Swift, um geordnete, durch Kommas getrennte Wertelisten zu erstellen. Sie sehen vielleicht klein aus, aber sie sind ziemlich mächtig! In diesem Tutorial besprechen wir, wie Sie Tupel in der praktischen iOS-Entwicklung verwenden können.

Ein Tupel (ausgesprochen „TEW-ple“) ist eine geordnete, durch Kommas getrennte Liste von Werten, die in Klammern eingeschlossen sind.

Hier ist ein Beispiel:

let Flight = („LAX“, 747)
print(„Wir fliegen mit einem \(flight.1) nach \(flight.0)“)

Im obigen Code lautet das Tupel („LAX“, 747). Sie können deutlich zwei Werte sehen, die durch ein Komma getrennt und in Klammern gesetzt sind. In der alltäglichen Codierung erkennt man ein Tupel am einfachsten an der Verwendung von Kommas und Klammern.

Der Typ des Tupels ist (String, Int). Der Typ des ersten Werts ist String und der Typ des zweiten Werts ist Int. Wieder durch Komma getrennt und in Klammern eingeschlossen.

Im vorherigen Beispiel haben wir auch die Syntax verwendet, um die Werte des Tupels abzurufen. Das Tupel ist eine Liste, und wir können zu seinen Werten gelangen, indem wir die Indizes 0, 1 usw. verwenden. Im nächsten Abschnitt werden wir uns weitere Möglichkeiten ansehen, mit Werten umzugehen.

Verwechseln Sie Tupel jedoch nicht mit Arrays, Wörterbüchern oder Mengen! Es handelt sich nicht um Sammlungen, aber sie gruppieren Werte. Die Werte eines Tupels können unterschiedliche Typen haben, und Sie können ihre Werte ändern, sofern sie mit var als veränderbar deklariert sind. Nach der Initialisierung können Sie jedoch keine weiteren Elemente hinzufügen.

Die Reihenfolge eines Tupels kann sich nach der Initialisierung nicht ändern. Die folgenden haben also keine identischen Typen:

(„LAX“, 747) // Typ ist (String, Int)
(747, „LAX“) // Typ ist (Int, String)

Hier ist die Reihenfolge wichtig. Obwohl beide dieselben Werte mit demselben Typ enthalten, sind ihre Typen unterschiedlich, da die Reihenfolge der Werte unterschiedlich ist.

Sie können Tupel miteinander vergleichen, wenn ihre Typen gleich sind und wenn die Typen selbst dem Equatable-Protokoll entsprechen. Mit anderen Worten: Wenn Sie ihre Werte vergleichen können, können Sie auch die Tupel selbst vergleichen.

Hier ist ein Beispiel:

sei a = („AMS“, 737)
sei b = („LAX“, 737)

a == b // Ist „falsch“, Tupel sind gleichwertig, weil String und Int gleichwertig sind

sei c = („AMS“, „A330-800“)
c == b // Compilerfehler, da die Typen nicht übereinstimmen

Im ersten Teil des obigen Codes vergleichen wir Tupel mit demselben Typ miteinander. Die einzelnen Typen sind konform zu Equatable, sodass wir die Gleichheit mit == feststellen können. Das zweite Beispiel ist etwas gekünstelt, aber offensichtlich: Sie können die inkompatiblen Typen (String, Int) und (String, String) nicht vergleichen.

Tuple wird „TEW-ple“ ausgesprochen, wie „Tuner“ und „Apple“. Das Wort leitet sich von der Zahl 2 ab, da ein typisches Tupel zwei Werte hat. Sie können jedoch unterschiedliche Namen verwenden, z. B. „single“ für einen Wert, „pair“ für zwei Werte, „triple“ für drei Werte usw., am häufigsten werden sie jedoch einfach als „Tupel“ bezeichnet. In Swift ist das Nulltupel (), das Nullwerte hat, gleich Void.

Sie müssen die Werte eines Tupels nicht anhand ihrer Indizes referenzieren. Sie können stattdessen Variablennamen verwenden! Schauen wir uns ein Beispiel an.

let Flight = (Flughafen: „LAX“, Flugzeug: 747, Kurs: 270)
print(„Wir fliegen mit einem \(flight.airplane) in Richtung \(flight.airport) mit Kurs \(flight.heading) Grad.“)

Interessant, oder? Wir verwenden eine Syntax wie „flight.airport“, um einen der Werte aus „flight“ abzurufen. Das Tupel selbst ist mit 3 Namen und 3 Werten definiert, getrennt durch Doppelpunkte und Kommas. Diese Syntax ähnelt dem Zugriff auf die Eigenschaften eines Objekts.

Was passiert, wenn Ihnen ein Tupel übergeben wird und Sie dessen einzelne Werte unterschiedlichen Variablennamen zuweisen möchten? Hier kommt die Zerlegung ins Spiel. Sie können das Tupel im Wesentlichen in separate Variablen oder Konstanten „zerlegen“.

So was:

let (airport, _, heading) = („LAX“, 747, 270)
drucken(Flughafen)

Folgendes passiert im obigen Code:

  • Das Tupel ist („LAX“, 747, 270). Es wird nicht als Ganzes einer Variablen oder Konstante zugewiesen, sondern seine Werte werden in separate Konstanten, Flughafen und Überschrift, zerlegt.
  • Wir drucken die Flughafenkonstante mit dem Wert „LAX“. Dieser Wert stammt aus dem Tupel, ist aber aufgrund der Zerlegung jetzt eine separate Konstante.
  • Der Unterstrich _ ist ein Wert, den wir ignorieren. Dies ist eine typische Swift-Syntax, die Sie vielleicht schon einmal gesehen haben, zum Beispiel in for-Schleifen mit for _ in 1…5 { .

Stellen Sie sich zum Beispiel vor, dass wir eine Funktion verwenden, die uns einen HTTP-Statuscode zurückgibt. Ein solcher Code besteht normalerweise aus einer Zahl wie 404 und etwas Text wie Nicht gefunden. Stellen Sie sich vor, die Funktion ist Teil eines Frameworks, sodass wir ihren Code nicht ändern können.

Auf geht’s:

func getStatusCode() -> (Int, String) {
return (404, „Nicht gefunden“)
}

let (code, text) = getStatusCode()
print(„Die Anfrage wurde mit dem Statuscode \(code) zurückgegeben und lautete: ‚\(text)‘“)

Sehen Sie, was dort passiert? Die Funktion gibt ein Tupel vom Typ (Int, String) zurück. Es sieht aus wie zwei Werte. Wie ist das möglich? Technisch gesehen gibt die Funktion einen Wert – ein Tupel – zurück, das aus zwei Werten besteht, einer Ganzzahl und einem String. (Überprüfen Sie dies selbst, indem Sie sich den Rückgabetyp der Funktion ansehen!)

Wir wollen auf die einzelnen Werte zugreifen, also zerlegen wir das Tupel mit (code, text). Von dort aus können wir den Code und den Text der einzelnen Konstanten verwenden, um die Werte auszudrucken. Eindrucksvoll!

Das Zerlegen eines Tupels kann auch als „Destrukturieren“, „Destruieren“ oder „Dekonstruieren“ bezeichnet werden. Wie auch immer Sie es nennen – Sie nehmen es auseinander!

Tupel mögen unbedeutend erscheinen, aber sie sind in der praktischen iOS-Entwicklung sehr nützlich. Wir haben uns bereits einen typischen Anwendungsfall angesehen: die Rückgabe von mehr als einem Wert von einer Funktion. Was kann man sonst noch mit ihnen machen?

Sie können Tupel als winzige Klassen betrachten, die Sie verwenden können, ohne zuerst eine tatsächliche Klasse zu definieren.

Schauen Sie sich das hier an:

Klasse Flug {
var Flughafen:String
var plane:Int
}

let Flight = Flug(Flughafen: „AMS“, Flugzeug: 330)
print(„Wir fliegen nach \(flight.airport)…“)

Der obige Code definiert zunächst eine Klasse „Flug“, initialisiert dann eine Instanz dieser Klasse und gibt schließlich „flight.airport“ aus. Das Gleiche können wir auch mit Tupeln machen – mit deutlich weniger Code.

let Flight = (Flughafen: „AMS“, Flugzeug: 330)
print(„Wir fliegen nach \(flight.airport)…“)

Sauber! Sie können den Typ des Tupels sogar erzwingen, indem Sie einen Typalias verwenden, etwa so:
typealias Flight = (Flughafen: String, Flugzeug: Int)
let Flight:Flight = („HND“, 737)
print(„Wir fliegen nach \(flight.airport)…“)

In der ersten Zeile des obigen Codes erstellen wir einen Alias ​​namens Flight für den Tupeltyp. Von da an können wir den Tupeltyp selbst und seinen Alias ​​austauschbar verwenden. In der zweiten und dritten Zeile kommentieren wir den Flug mit dem Flugtyp und geben dann seinen Wert für den Flughafen aus.

Interessant ist auch, dass Sie den Flight-Typ im obigen Code verwenden können, ohne auch die Namen der Tupelwerte zu deklarieren. Sie können dies in der zweiten Zeile im obigen Code sehen. Der Typ ist auf Flug eingestellt und der Tupelwert ist („HND“, 737) anstelle von (Flughafen: „HND“, Flugzeug: 737). Das ist viel prägnanter!

Und zu guter Letzt können Tupel verwendet werden, um mithilfe der Funktion enumerated() auf die Indizes und Werte von Array-Elementen zuzugreifen. Hier ist wie:

lass Treiber = [“Magnussen”, “Raikkonen”, “Hamilton”, “Verstappen”]

for (index, name) in drivers.enumerated()
{
print(“\(Name) hat Position \(Index)”)
}

Im obigen Code gibt die Funktion enumerated() für das Array drivers eine Liste von Paaren – ein Tupel – mit Array-Indizes und -Werten zurück. Wir zerlegen dieses Tupel mit (index, name), damit wir auf die einzelnen Indizes und Werte zugreifen können. Sauber!

Fun Fact: Bis Swift 2.1 waren die Parameter einer Funktion tatsächlich Tupel, sogenannte Tupel-Splats. Schließlich werden auch die Parameter einer Funktion mit Klammern, Doppelpunkten und Kommas geschrieben. Sie können dies jedoch in Swift 5 nicht verwenden, da die Syntax mehr Schaden als Nutzen verursacht hat.

Tupel sind so einfach und doch so mächtig. Wer hätte gedacht, dass einige in Klammern eingeschlossene Werte Ihnen dabei helfen könnten, Code so produktiv zu schreiben?

In diesem Tutorial haben wir besprochen, was Tupel sind und wie Sie sie in Swift verwenden können. Wir haben uns Zerlegung, Tupeltypen und praktische Anwendungsfälle für die alltägliche iOS-Entwicklung angesehen.

Tupel sind Teil von Sammlungen in Swift. Wir haben einige Sammlungstypen, wie zum Beispiel:

Table of Contents