Wörterbücher sind einer der primären Sammlungstypen von Swift. Ein Wörterbuch speichert ungeordnete Zuordnungen zwischen eindeutigen Schlüsseln und den zugehörigen Werten. Alle Schlüssel in einem Wörterbuch müssen vom selben Typ sein, und auch alle Werte müssen denselben Typ haben.
Wörterbuch-Literale werden als kommagetrennte key: value-Paare in eckigen Klammern geschrieben:
var addresses: Dictionary<String, String> = [
"The Munsters": "1313 Mockingbird Lane",
"The Simpsons": "742 Evergreen Terrace",
"Buffy Summers": "1630 Revello Drive"
]
var sequences: [String: [Int]] = [
"Euler's totient": [1, 1, 2, 2, 4, 2, 6, 4],
"Lazy caterer": [1, 2, 4, 7, 11, 16, 22, 29, 37],
"Carmichael": [561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841]
]
let constants = [
"pi": 3.14159,
"e": 2.71828,
"phi": 1.618033,
"avogadro": 6.02214076e23
]
Wörterbuch-Typen kannst du auf zwei Arten explizit schreiben: Dictionary<Key, Value> oder mit der Kurzschreibweise [Key: Value].
Um ein leeres Wörterbuch zu erstellen, gibst du seine Schlüssel- und Werttypen explizit an:
var emptyDict1: [Int: Int] = [:]
var emptyDict2 = [Character: String]()
var emptyDict3 = Dictionary<Int, Double>()
Du kannst auf Werte mit der Subscript-Schreibweise zugreifen: Setze den Schlüssel in eckige Klammern hinter den Namen des Wörterbuchs.
Da ein Schlüssel möglicherweise nicht im Wörterbuch existiert, liefert der Subscript-Zugriff ein Optional (Value?) zurück.
Wenn der Schlüssel vorhanden ist, gibt Swift den umschlossenen Wert zurück; wenn nicht, gibt es nil zurück:
let munster: String? = addresses["The Munsters"]
// Returns Optional("1313 Mockingbird Lane")
let carmichael = sequences["Carmichael"]
// Returns Optional([561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841])
let planck = constants["planck"]
// Returns nil
Um nicht mit Optionals arbeiten zu müssen, kannst du mit dem Parameter default einen Standardwert angeben:
let e: Double = constants["e", default: 0]
// Returns 2.71828
let hoagie: [Int] = sequences["Hoagie", default: []]
// Returns []
let betty = addresses["Betty Cooper", default: "Address unknown"]
// Returns "Address unknown"
Bei veränderbaren Wörterbüchern, die du mit var deklariert hast, kannst du Schlüssel-Wert-Paare mithilfe einer Subscript-Zuweisung hinzufügen oder aktualisieren:
sequences["Euler's totient"]?.append(contentsOf: [6, 4])
// sequences["Euler's totient"] is now [1, 1, 2, 2, 4, 2, 6, 4, 6, 4]
addresses["Betty Cooper"] = "111 Queens Ave."
addresses["Betty Cooper", default: "Address unknown"]
// Returns "111 Queens Ave."
constants["Gelfond's"] = 23.140692
// Compiler error: Cannot assign through subscript: 'constants' is a 'let' constant
Du kannst mit einer for-in-Schleife über jedes Schlüssel-Wert-Paar eines Wörterbuchs iterieren.
Jedes Element wird als (key, value)-Tupel bereitgestellt:
for (name, address) in addresses {
print("\(name) lives at \(address)")
}
Da Wörterbücher ungeordnet sind, ergibt ihre Sortierung ein Array aus Schlüssel-Wert-Paaren.
Du kannst der Methode sorted(by:) eine Closure übergeben, die zwei (key, value)-Tupel vergleicht und true zurückgibt, wenn das erste Tupel vor dem zweiten erscheinen soll:
func sortByNameLengthThenValue(_ lhs: (key: String, value: Double), _ rhs: (key: String, value: Double)) -> Bool {
let left = lhs.value + Double(lhs.key.count)
let right = rhs.value + Double(rhs.key.count)
return left < right
}
let sortedConstants = constants.sorted(by: sortByNameLengthThenValue)
In dieser Übung implementierst du eine Möglichkeit, die Highscores für das beliebteste Spiel in deiner Spielhalle im Blick zu behalten.
Du musst 7 Funktionen implementieren, die alle ein Wörterbuch mit Highscore-Daten zurückgeben oder verändern.
Erstelle eine Funktion newScoreBoard(), die keine Parameter entgegennimmt und ein neues Highscore-Wörterbuch zurückgibt, das Werte vom Typ String für die Schlüssel und Werte vom Typ Int als Werte verwendet.
Um einen Spieler zum Highscore-Wörterbuch hinzuzufügen, definiere addPlayer(_:_:_:), eine Funktion, die 3 Parameter entgegennimmt:
var highScores = newScoreBoard()
addPlayer(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0]
addPlayer(&highScores, "José Valim", 486_373)
// Returns ["Dave Thomas": 0, "José Valim": 486_373]
Um einen Spieler aus dem Highscore-Wörterbuch zu entfernen, definiere removePlayer(_:_:), die 2 Parameter entgegennimmt:
Diese Funktion sollte den Spieler aus dem Wörterbuch entfernen, wenn er darin enthalten ist, und ansonsten nichts tun.
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
removePlayer(&highScores, "Dave Thomas")
// Returns ["José Valim": 486_373]
removePlayer(&highScores, "Rose Fanaras")
// Returns ["José Valim": 486_373]
Um die Punktzahl eines Spielers zurückzusetzen, definiere resetPlayer(_:_:), die 2 Parameter entgegennimmt:
Die Funktion setzt die Punktzahl des Spielers auf 0. Wenn der Spieler nicht im Wörterbuch steht, soll nichts passieren.
var highScores = ["Dave Thomas": 486_373, "José Valim": 10]
resetScore(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0, "José Valim": 10]
Um die Punktzahl eines Spielers zu aktualisieren, indem du etwas zur bisherigen Punktzahl addierst, definiere updateScore, die 3 Parameter entgegennimmt:
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
addPlayer(&highScores, "Freyja Ćirić", 12_771_008)
updateScore(&highScores, "Freyja Ćirić", 73)
// Returns ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_081]
Definiere die Funktion orderByPlayers, die 1 Parameter entgegennimmt:
Die Funktion gibt ein Array aus (String, Int)-Tupeln zurück, also die Spieler und ihre Highscores, aufsteigend nach dem Namen des Spielers sortiert.
var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByPlayers(highScores)
// Returns [("Dave Thomas", 0), ("Freyja Ćirić", 12_771_091), ("José Valim", 486_373)]
Um eine Liste von Spielern zu erhalten, die nach ihren Punktzahlen absteigend sortiert ist, definiere orderByScores, die 1 Parameter entgegennimmt:
Die Funktion gibt ein Array aus (String, Int)-Tupeln zurück, also die Spieler und ihre Highscores, absteigend nach der Punktzahl des Spielers sortiert.
var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByScores(highScores)
// Returns [("Freyja Ćirić", 12_771_091), ("José Valim", 486_373), ("Dave Thomas", 0)]
Melde dich bei Exercism an, um Swift mit 35 Konzepte116 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.