Dictionaries in Swift

Was sind Dictionaries? Wie Arrays und Sets gehören sie zu den Collections (oder: Collection Types). Sie werden dazu verwendet, um darin Objekte nach dem Key-Value-Prinzip abzulegen. Dabei kann der Schlüssel nur einmal vorkommen.

Collection Types in Swift

Ein Dictionary lässt sich sehr einfach erstellen:

var capitolCities: Dictionary = ["Bayern" : "München", "Hessen" : "Wiesbaden"]

In Swift ist es nicht erforderlich, den Datentyp anzugeben (type annotation). Denn Swift ist in der Lage, selbigen selbständig zu ermitteln (type inference); möglich wäre also auch:

var capitolCities = ["Bayern" : "München", "Hessen" : "Wiesbaden"]

Es existiert noch folgende alternative Möglichkeit der Deklaration:

var age: Dictionary<String, Int> = ["Bob" : 24, "Tom" : 33]

Dictionaries können konstant (let) oder variabel (var) erzeugt werden. Sie sind dann dementsprechend unveränderbar (immutable) oder veränderbar (mutable).

Dictionaries geben ein Optional zurück. Deswegen muss entweder das Auspacken dieses Optionals mithilfe eines ! erzwungen werden (implicitly unwrapped) oder man nutzt if let.

let hessen = capitolCities["Hessen"]!
print("Die Hauptstadt von Hessen ist \(hessen).")
if let bayern = capitolCities["Bayern"] {
    print("Die Hauptstadt von Bayern ist \(bayern).")
}

Die Key-Value-Paare eines Dictionary können wie folgt durchlaufen und angezeigt werden:

for key in capitolCities.keys {
    print("Key: \(key) - Value: \(capitolCities[key]!)")
}

In der Konsole würde folgende Ausgabe angezeigt werden:

Key: Hessen - Value: Wiesbaden
Key: Bayern - Value: München

Die Schlüssel und Werte des Dictionary können wie folgt verändert werden:

// Schlüssel und Wert hinzufügen:
capitolCities["Thüringen"] = "Erfurt"

// Schlüssel und Wert verändern:
age["Bob"] = 25

// Schlüssel und Wert löschen:
age ["Tom"] = nil

Darüber hinaus existieren für das Verändern eines Dictionaries verschiedene Methoden:

age.updateValue(24, forKey: "Bob")
capitolCities.removeValueForKey("Thüringen")
capitolCities.removeAll(keepCapacity: true)