TEAM LICENSES: Save money and learn new skills through a Hacking with Swift+ team license >>

Arrays

Arrays erlauben es viele Werte in einer einzigen Collection zu gruppieren. Anschließend ist es möglich über ihre Position in dieser Collection wieder auf sie zu zugreifen. Swift leitet den Datentyp der Elemente in einem Array automatisch ab, so wie hier:

var evenNumbers = [2, 4, 6, 8]
var songs = ["Shake it Off", "You Belong with Me", "Back to December"]

Wie du siehst verwendet Swift eckige Klammern um den Start und das Ende eines Arrays zu kennzeichnen und die einzelnen Elemente werden durch Kommas getrennt.

Möchtest du die Elemente eines Arrays auslesen, musst du eines beachten: Swift fängt bei 0 an zu zählen. Das erste Element ist 0, das Zweite ist 1, das Dritte ist 2 usw. Versuche dies in deinem Playground:

var songs = ["Shake it Off", "You Belong with Me", "Back to December"]
songs[0]
songs[1]
songs[2]

Du solltest "Shake it Off", "You Belong with Me" und "Back to December" im Ergebnisbereich angezeigt sehen.

Die Position eines Elements in einem Array wird Index genannt und du kannst alle Elemente über ihren Index auslesen. Allerdings sei vorsichtig: Dein Array hat drei Elemente, d.h. sie haben die Indizes 0, 1 und 2. Wenn du aber versuchst songs[3] zu lesen wird dein Playground nicht mehr funktionieren. In einer App würde dies bedeuten, dass sie abstürzt!

Da du ein Array mit Strings erstellt hast weiß Swift nun, dass der Datentyp "Array aus Strings" ist. Um dies zu überprüfen, kannst du einen Befehl im Playground verwenden um dir den Datentyp einer Variable anzeigen zu lassen. Das geht so:

var songs = ["Shake it Off", "You Belong with Me", "Back to December"]
type(of: songs)

Es wird Array<String>.Type im Ergebnisbereich ausgegeben und bestätigt, dass Swift songs korrekterweise als ein Array aus Strings betrachtet.

Nehmne wir nun an du machst einen Fehler und fügst aus Versehen eine Zahl am Ende des Arrays hinzu. Versuche dies in deinem Playground:

var songs = ["Shake it Off", "You Belong with Me", "Back to December", 3]
type(of: songs)

Du wirst einen Fehler angezeigt bekommen. Das Problem ist allerdings nicht, dass Swift nicht mit Arrays aus verschiedenen Datentypen umgehen kann - das werde ich dir später noch zeigen - sondern, dass es versucht dir zu helfen. Die Fehlermeldung ist: "heterogenous collection literal could only be inferred to '[Any]'; add explicit type annotation if this is intentional." Auf Deutsch heißt dies so viel wie: "Es sieht so aus als soll dieses Array verschiedene Datentypen beinhalten. Wenn du das wirklich willst, dann gib es explizit an".

Typensicherheit ist wichtig und obwohl es nett ist, dass Swift Arrays mit beliebigen Datentypen erstellen kann, war es in diesem Fall ein Fehler. Zum Glück habe ich dir bereits gezeigt, dass du Typannotationen verwenden kannst, um anzugeben welche Art von Daten du in dem Array speichern möchtest. Um den Typ eines Array zu bestimmen, schreibe den Datentyp zwischen eckige Klammern:

var songs: [String] = ["Shake it Off", "You Belong with Me", "Back to December", 3]

Wir haben Swift nun gezeigt, dass wir nur Strings in dem Array speichern wollen, wird es sich weigern den Code auszuführen, denn 3 ist kein String.

Wenn du wirklich alle Arten von Daten in einem Array speichern willst, benutze den Any type:

var songs: [Any] = ["Shake it Off", "You Belong with Me", "Back to December", 3]

Erstellen von Arrays

Wenn du ein Array mit der oben beschriebenen Syntax erstellen möchtest, dann erstellt Swift das Array und füllt es mit den angegebenen Werten. Es ist nicht ganz so einfach wenn du ein Array erstellen und später füllen willst. Diese Syntax funktioniert z.B. nicht:

var songs: [String]
songs[0] = "Shake it Off"

Der Grund dafür erscheint zunächst unnötig pedantisch, aber hat tiefe Auswirkungen auf die Performance, weswegen wir ihn akzeptieren müssen. Einfach ausgedrückt sagt var songs: [String] Swift, dass die Variable songs ein Array aus Strings beinhalten wird, aber es erstellt nicht das Array. Es alloziert keinen RAM oder führt irgendwelche anderen Schritte aus um ein Swift Array zu erstellen. Es besagt nur, dass es irgendwann ein Array geben wird und dass es Strings enthalten wird.

Es gibt zwei Wege dies korrekt auszudrücken und einer macht zu diesem Zeitpunkt vermutlich am meisten Sinn.

var songs: [String] = []

Hier wird wieder eine Typannotation verwendet um es klar zu machen, dass wir wir ein Array von Strings haben wollen. Zudem weist es der Variable ein leeres Array zu (das []).

Außerdem wirst du häufig diese Version sehen:

var songs = [String]()

Dies bedeutet das Gleiche: das () sagt Swift, dass wir ein Array erstellen wollen was dann zu songs zugewiesen wird. Diese Version ist zwei Zeichen kürzer, daher bevorzugen sie die meisten Programmierer.

Array Operatoren

Es gibt ein limitiertes Set von Operatoren, die du auf Arrays verwenden kannst. Zum Beispiel kannst du zwei Objekte vereinen:

var songs = ["Shake it Off", "You Belong with Me", "Love Story"]
var songs2 = ["Today was a Fairytale", "Welcome to New York", "Fifteen"]
var both = songs + songs2

Du kannst auch += verwenden um Elemente hinzuzufügen und zuzuweisen:

both += ["Everything has Changed"]
Hacking with Swift is sponsored by Blaze.

SPONSORED Still waiting on your CI build? Speed it up ~3x with Blaze - change one line, pay less, keep your existing GitHub workflows. First 25 HWS readers to use code HACKING at checkout get 50% off the first year. Try it now for free!

Reserve your spot now

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

Average rating: 5.0/5

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.