German (Deutsch) translation by Katharina Grigorovich-Nevolina (you can also view the original English article)
Im vorigen Artikel haben Sie sich mit Variablen, Konstanten und einigen gängigen Datentypen wie Ganzzahlen, Gleitkommazahlen und Strings vertraut gemacht. In diesem Artikel vergrößern wir Sammlungen. Die Standardbibliothek von Swift definiert zwei Auflistungstypen, Arrays und Wörterbücher. Beginnen wir mit Arrays.
1. Arrays
Wenn Sie mit Objective-C, JavaScript oder PHP vertraut sind, wird es Ihnen nicht schwer fallen, sich mit dem Konzept von Arrays zu beschäftigen. Ein Array ist eine geordnete, null indizierte Wertesammlung. Es gibt jedoch einige wichtige Unterschiede.
Typ
Der erste wichtige Unterschied bei Arrays in Objective-C besteht darin, dass die in einem Array gespeicherten Werte immer vom selben Typ sind. Auf den ersten Blick scheint das eine erhebliche Einschränkung zu sein, ist es aber tatsächlich nicht. Tatsächlich hat diese Einschränkung einen wichtigen Vorteil. Wir wissen genau, welchen Typ wir zurückbekommen, wenn wir das Array nach einem seiner Werte fragen.
Ein weiterer wesentlicher Unterschied zu Objective-C-Arrays besteht in der Art von Werten, die ein Array speichern kann. In Objective-C kann ein Array nur Werte eines Klassentyps speichern. Swift hat diese Einschränkung nicht. Ein Array in Swift kann Strings, Ganzzahlen, Floats sowie Klasseninstanzen speichern. Wie das funktioniert und warum dies in Swift möglich ist, wird später in dieser Serie deutlich, wenn wir Klassen und Strukturen behandeln.
Erklärung
Das Erstellen eines Arrays kann auf verschiedene Arten erfolgen, Sie müssen jedoch berücksichtigen, dass Swift wissen muss, welche Werte Sie im Array speichern möchten. Erstellen Sie einen neuen Spielplatz in Xcode wie im vorherigen Artikel und fügen Sie Ihrem Spielplatz die folgenden Zeilen hinzu.
1 |
var array1: Array<String> |
2 |
var array2: [String] |
3 |
var array3 = ["Apple", "Pear", "Orange"] |
Die zweite Zeile ist eine Abkürzung für die erste Zeile. Die eckigen Klammern, die das String
-Schlüsselwort umschließen, weisen Swift an, dass wir ein Array deklarieren, das nur String
-Objekte enthalten kann.
Sie könnten die erste Codezeile lesen als "Wir deklarieren eine Variable namens array1
vom Typ Array
, die nur String
-Objekte enthalten kann." Beachten Sie, dass ich den Typ kursiv geschrieben habe, da dies der Doppelpunkt bedeutet.
Die dritte Zeile zeigt, wie ein Array mit einem Arrayliteral initialisiert wird. Array-Literale sehen in Objective-C sehr ähnlich zu Array-Literalen aus. Der Hauptunterschied ist das Fehlen des Symbols @
vor den eckigen Klammern und den String-Literalen.
Es gibt auch eine fantastische Möglichkeit, ein Array mit einer vordefinierten Anzahl von Standardwerten zu initialisieren. Die Syntax mag anfangs verwirrend sein. Nehmen Sie sich jedoch einen Moment Zeit, um sie einzusinken.
1 |
var a = [String](count: 5, repeatedValue: "Test") |
Das resultierende Array enthält fünf Zeichenfolgen, wobei jede Zeichenfolge gleich "Test"
ist. Um die oben genannte Initialisierung besser zu verstehen, werfen Sie einen Blick auf die folgenden zwei Codezeilen, in denen wir ein leeres Array von Strings initialisieren.
1 |
var b = Array<String>() |
2 |
var c = [String]() |
Machen Sie sich keine Sorgen, wenn Sie immer noch verwirrt sind. Wir werden die Syntax genauer untersuchen, sobald wir uns mit Klassen und Funktionen befassen. In diesem Artikel konzentrieren wir uns nur auf Sammlungen.
Wandlungsfähigkeit
Ein Aspekt von Swift, den Sie schnell zu schätzen wissen, ist die Deklaration von veränderlichen Sammlungen. Das obige Code-Snippet deklariert beispielsweise drei veränderliche Arrays. Ein veränderbares Array wird mit dem Schlüsselwort var
definiert. So einfach ist das. Wenn Sie nicht möchten, dass ein Array veränderbar ist, verwenden Sie stattdessen das Schlüsselwort let
. Swift zielt darauf ab, intuitiv und benutzerfreundlich zu sein, und Swifts Implementierung von Mutabilität ist ein perfektes Beispiel für dieses Ziel.
Werte abrufen und einstellen
Um auf die in einem Array gespeicherten Werte zuzugreifen, verwenden wir dieselbe Indexsyntax wie in Objective-C. Im folgenden Beispiel fragen wir array3
nach dem zweiten Element, der Zeichenfolge "pear"
.
1 |
array3[1] |
Das Ersetzen des unter Index 1
gespeicherten Wertes ist so einfach wie das Zuweisen eines neuen Werts mit derselben Subskriptionssyntax. Im folgenden Beispiel ersetzen wir "pear"
an Index 1
durch "peach"
.
1 |
array3[1] = "Peach" |
Dies ist nur möglich, weil das Array veränderbar ist, d.h., das Array wurde mit dem Schlüsselwort var
deklariert. Das Mutieren eines konstanten Arrays ist nicht möglich. Es gibt fortgeschrittenere Techniken zum Manipulieren des Inhalts eines Arrays, aber das zugrunde liegende Konzept ist das gleiche.
Das Zusammenführen von zwei Arrays ist so einfach wie das Zusammenfügen. Im folgenden Beispiel werden zwei unveränderliche Arrays deklariert und zusammengeführt. Beachten Sie, dass das resultierende Array c
nicht veränderlich sein muss, damit dies funktioniert.
1 |
let a = [1, 2, 3] |
2 |
let b = [4, 5, 6] |
3 |
|
4 |
let c = a + b |
Entscheidend ist jedoch, dass die in a
und b
gespeicherten Werte vom gleichen Typ sind. Der Grund sollte jetzt offensichtlich sein. Die in einem Array gespeicherten Werte müssen vom selben Typ sein. Das folgende Beispiel führt zu einem Fehler.
1 |
let a = [1, 2, 3] |
2 |
let b = [1.5, 5.2, 6.3] |
3 |
|
4 |
let c = a + b |
Um ein Array an ein veränderbares Array anzuhängen, verwenden wir den Operator +=
. Beachten Sie, dass der Operand rechts ein Array ist. Diese Operation würde nicht funktionieren, wenn wir die eckigen Klammern um 4
entfernen.
1 |
var a = [1, 2, 3] |
2 |
a += [4] |
Operationen
Arrays sind Objekte, an denen Sie eine Vielzahl von Operationen ausführen können. Arrays legen eine Reihe von Funktionen oder Methoden offen. Um eine Methode für ein Objekt aufzurufen, verwenden Sie die Punktnotation. Fügen Sie Ihrem Spielplatz die folgende Zeile hinzu, um ein Element zu array3
hinzuzufügen.
1 |
array3.append("Cherry") |
Lassen Sie uns sehen, wie viele Elemente array3
enthält, indem Sie die Methode count
aufrufen. Das gibt 4
im Ergebnisbereich rechts aus.
1 |
array3.count |
Es ist auch möglich, ein Element an einem bestimmten Index einzufügen, indem die insert
-Methode des Arrays aufgerufen wird (sehen Sie unten). Die insert
-Methode akzeptiert mehr als einen Parameter und sieht auf den ersten Blick etwas ungerade aus.
1 |
array3.insert("Prune", atIndex: 2) |
Wie Objective-C unterstützt Swift benannte Parameter, um die Lesbarkeit zu verbessern. Das Ergebnis ist, dass Code einfacher zu lesen und zu verstehen ist und Funktionen oder Methoden nicht viel erklärt werden müssen. Es ist zum Beispiel klar, dass die insert
-Methode ein Element an Index 2
einfügt.
Während Swift prägnanter und weniger ausführlich ist als Objective-C, werden benannte Parameter unterstützt. Wenn Sie von PHP, Ruby oder JavaScript kommen, ist dies sicherlich etwas gewöhnungsbedürftig.
Komfortmethoden
Was ich an Swift wirklich schätze, sind die Ruby-ähnlichen Komforteigenschaften und -methoden der Standard-Bibliothek von Swift. Ein Array verfügt beispielsweise über eine isEmpty
-Eigenschaft, die Sie darüber informiert, ob das Array Elemente enthält. Dies ist nichts anderes als eine Abkürzung für die Überprüfung der count
-Eigenschaft des Arrays. Das Ergebnis ist jedoch Code, der übersichtlicher und leichter lesbar ist.
1 |
array3.isEmpty |
2. Wörterbücher
Wörterbücher verhalten sich ähnlich wie Wörterbücher in Objective-C. Ein Wörterbuch speichert eine ungeordnete Sammlung von Werten. Jeder Wert im Wörterbuch ist einem Schlüssel zugeordnet. Mit anderen Worten, ein Wörterbuch speichert eine Reihe von Schlüssel/Wert-Paaren.
Typ
Wie bei Arrays müssen die in einem Wörterbuch gespeicherten Schlüssel und Werte vom selben Typ sein. Das heißt, wenn Sie ein Wörterbuch nach dem Wert eines bestimmten Schlüssels fragen, wissen Sie, welchen Typ das Wörterbuch zurückgibt.
Erklärung
Die Deklaration eines Wörterbuchs ähnelt der Deklaration eines Arrays. Der Unterschied besteht darin, dass Sie den Typ für Schlüssel und Werte angeben müssen. Das folgende Beispiel zeigt drei Möglichkeiten, ein Wörterbuch zu deklarieren.
1 |
var dictionary1: Dictionary<String, Int> |
2 |
var dictionary2: [String: Int] |
3 |
var dictionary3 = ["Apple": 3, "Pear": 8, "Orange": 11] |
Die zweite Zeile ist eine Abkürzung für die erste Zeile. Die Schlüssel dieser Wörterbücher müssen vom Typ String
sein, während erwartet wird, dass die Werte vom Typ Int
sind. Das Schlüsselwort var
zeigt an, dass die Wörterbücher veränderbar sind.
Sie könnten die erste Codezeile lesen als "Wir deklarieren eine Variable namens dictionary1
vom Typ Dictionary
, die nur Schlüssel des Typs String
und Werte des Typs Int
enthalten kann."
Die dritte Zeile zeigt, wie wir ein Wörterbuch mit einem Wörterbuchliteral initialisieren können. Das ähnelt der in Objective-C verwendeten Syntax. Beachten Sie jedoch, dass die geschweiften Klammern durch eckige Klammern ersetzt werden und dem Literal kein @
-Zeichen vorangestellt ist.
Werte abrufen und einstellen
Der Zugriff auf Werte ähnelt dem Zugriff auf Werte eines Arrays. Der einzige Unterschied besteht darin, dass Sie den Schlüssel anstelle des Index des Werts verwenden, auf den Sie zugreifen müssen. Das folgende Beispiel veranschaulicht das.
1 |
let value = dictionary3["Apple"] |
2 |
println(value) |
Sie werden feststellen, dass Xcode uns sagt, dass der Wert von value
nicht 3
ist, sondern Optional (3)
. Was bedeutet das? Swift verwendet Optionale, um Werte umzuwandeln, bei denen es sich um zwei Dinge handeln kann, einen Wert oder einen nil
. Machen Sie sich an diesem Punkt keine Sorgen um Optionale. Wir werden uns im nächsten Artikel dieser Serie auf Optionale konzentrieren. Lassen Sie mich nur sagen, dass Optionale ein weiteres Schlüsselkonzept der Programmiersprache Swift sind.
Es ist interessant darauf hinzuweisen, dass die Syntax für den Zugriff auf einen Wert eines Wörterbuchs mit der von Arrays identisch ist, wenn die Schlüssel des Wörterbuchs vom Typ Int
sind. Schauen Sie sich das folgende Beispiel an, um zu sehen, was ich meine.
1 |
var dictionary4 = [0: "Apple", 1: "Pear", 2: "Orange"] |
2 |
let fruit = dictionary4[0] |
Operationen
Wie bei Arrays definiert die Swift-Standardbibliothek eine Vielzahl von Operationen, die Sie für Wörterbücher ausführen können. Ein Wörterbuch gibt die Anzahl der Schlüssel/Wert-Paare zurück, indem coun
t für es aufgerufen wird. Das Entfernen eines Schlüssel/Wert-Paares ist einfach und intuitiv, wie das nächste Beispiel veranschaulicht. Das ist natürlich nur möglich, wenn das Wörterbuch veränderbar ist.
1 |
dictionary4.removeValueForKey(0) |
Wenn Sie anfangen, Swift zu lernen, stoßen Sie gelegentlich auf Codeausschnitte, die seltsam oder verwirrend aussehen. Schauen Sie sich die folgende Zeile an, in der wir zuerst ein Wörterbuch deklarieren und dann dessen Schlüssel/Wert-Paare entfernen.
1 |
var dictionary = [String: Int]() |
2 |
|
3 |
dictionary["Oranges"] = 2 |
4 |
dictionary["Apples"] = 10 |
5 |
dictionary["Pears"] = 5 |
6 |
|
7 |
dictionary = [:] |
Man muss zugeben, dass die letzte Zeile etwas seltsam aussieht. Da Swift die Typen und Schlüssel kennt, die im dictionary
gespeichert werden können, ist das Leeren des Wörterbuchs so einfach wie das Zuweisen eines leeren Wörterbuchs.
In diesem Fall müssen Sie die Typen für die Schlüssel und Werte nicht angeben, da wir dies bereits getan haben, als wir das Wörterbuch in der ersten Zeile deklarieren. Das weist auf ein anderes wichtiges Detail hin, dh der Wertetyp, den Sie in Arrays und Wörterbüchern speichern können, kann nicht geändert werden, sobald die Sammlung deklariert ist.
3. Tupel
Sie werden Tupel lieben. Während Tupel keine Sammlungen sind, gruppieren sie auch mehrere Werte. Ähnlich wie bei Arrays und Wörterbüchern können Tupel Werte eines beliebigen Typs enthalten. Der Hauptunterschied besteht jedoch darin, dass die in einem Tupel gespeicherten Werte nicht vom gleichen Typ sein müssen. Sehen wir uns ein Beispiel an, um dies näher zu erläutern.
1 |
var currency = ("EUR", 0.81) |
2 |
var time = (NSDate(), "This is my message.") |
3 |
var email = ("Bart Jacobs", "bart@example.com") |
Das erste Beispiel deklariert ein Tupel mit dem Namen currency
vom Typ (String, Int)
. Das zweite Tupel time enthält eine NSDate
-Instanz und ein String-Literal. Die in der email
gespeicherten Werte sind beide vom Typ String
. Das bedeutet, dass email
vom Typ (String, String)
ist.
Auf Werte zugreifen
Indizes
Um auf einen in einem Tupel gespeicherten Wert zuzugreifen, verwenden Sie den Index, der dem gewünschten Wert entspricht.
1 |
var rate = currency.1 |
2 |
var message = time.1 |
3 |
var name = email.0 |
Xcode zeigt uns die Indizes aller Werte, die in einem Tupel im Ergebnisbereich des Spielplatzes rechts gespeichert sind.



Namen
Um die Lesbarkeit zu verbessern, können Sie die in einem Tupel gespeicherten Werte benennen. Das Ergebnis ist, dass Sie auf die Werte des Tupels statt über ihre Indizes auf deren Namen zugreifen können. Die Deklaration eines Tupels ist in diesem Fall etwas anders.
1 |
var currency = (name: "EUR", rate: 0.81) |
2 |
let currencyName = currency.name |
3 |
let currencyRate = currency.rate |
Zersetzung
Es gibt eine zweite, elegantere Art und Weise, mit den in einem Tupel gespeicherten Werten zu arbeiten. Schauen Sie sich das folgende Beispiel an, in dem wir den currency
-Inhalt zerlegen.
1 |
let (currencyName, currencyRate) = currency |
Der currency
-Wert am Index 0
wird in currencyName
gespeichert und der Wert am Index 1
wird in currencyRate
gespeichert. Es ist nicht erforderlich, den Typ für currencyName
und currencyRate
anzugeben, da Swift den Typ aus den in der currency
gespeicherten Werten ableitet. Mit anderen Worten, currencyName
ist vom Typ String
und currencyRate
vom Typ Float
.
Wenn Sie nur an bestimmten Werten eines Tupels interessiert sind, können Sie einen Unterstrich verwenden, um Swift mitzuteilen, an welchen Werten Sie nicht interessiert sind.
1 |
let (currencyName, _) = currency |
Erfahren Sie mehr in unserem Swift-Programmierkurs
Bringen Sie Ihre Swift-Ausbildung auf die nächste Stufe und lernen Sie alles über die Spielplätze bis hin zur objektorientierten Programmierung in unserem gesamten Kurs zur Swift-Entwicklung.
Schlussfolgerung
Arrays und Wörterbücher sind grundlegende Bestandteile fast jeder Programmiersprache, und Swift unterscheidet sich nicht. Während sich Sammlungen in Swift etwas anders verhalten, ist es nicht lange her, um sich mit den Kollektionstypen von Swift vertraut zu machen, wenn Sie mit Arrays und Wörterbüchern in anderen Programmiersprachen gearbeitet haben. Im nächsten Lernprogramm werden Optionen und Kontrollfluss untersucht.