Tracks
/
Swift
Swift
/
Übungen
/
Bestenliste
Bestenliste

Bestenliste

Lernübung

Einführung

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>()

Zugriff auf Werte

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"

Wörterbücher ändern

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

Über ein Wörterbuch iterieren

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)")
}

Wörterbücher sortieren

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)

Anleitung

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.

1. Ein neues Highscore-Wörterbuch definieren

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.

2. Spieler zum Highscore-Wörterbuch hinzufügen

Um einen Spieler zum Highscore-Wörterbuch hinzuzufügen, definiere addPlayer(_:_:_:), eine Funktion, die 3 Parameter entgegennimmt:

  • Der erste Parameter ist das Wörterbuch mit den Punktzahlen. Er sollte ein In-out-Parameter sein.
  • Der zweite Parameter ist der Name eines Spielers als String.
  • Der dritte Parameter ist die Punktzahl als Ganzzahl. Der Parameter ist optional; implementiere den dritten Parameter mit dem Standardwert 0.
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]

3. Spieler aus dem Punktzahlen-Wörterbuch entfernen

Um einen Spieler aus dem Highscore-Wörterbuch zu entfernen, definiere removePlayer(_:_:), die 2 Parameter entgegennimmt:

  • Der erste Parameter ist das Wörterbuch mit den Punktzahlen. Er sollte ein In-out-Parameter sein.
  • Der zweite Parameter ist der Name des Spielers als String.

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]

4. Die Punktzahl eines Spielers zurücksetzen

Um die Punktzahl eines Spielers zurückzusetzen, definiere resetPlayer(_:_:), die 2 Parameter entgegennimmt:

  • Der erste Parameter ist das Wörterbuch mit den Punktzahlen. Er sollte ein In-out-Parameter sein.
  • Der zweite Parameter ist der Name des Spielers als String, dessen Punktzahl du zurücksetzen möchtest.

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]

5. Die Punktzahl eines Spielers aktualisieren

Um die Punktzahl eines Spielers zu aktualisieren, indem du etwas zur bisherigen Punktzahl addierst, definiere updateScore, die 3 Parameter entgegennimmt:

  • Der erste Parameter ist das Wörterbuch mit den Punktzahlen. Er sollte ein In-out-Parameter sein.
  • Der zweite Parameter ist der Name des Spielers als String, dessen Punktzahl du aktualisieren möchtest.
  • Der dritte Parameter ist die Punktzahl, die du zum gespeicherten Highscore hinzufügen möchtest.
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]

6. Eine Liste von Spielern mit Punktzahlen abrufen, nach Spielername sortiert

Definiere die Funktion orderByPlayers, die 1 Parameter entgegennimmt:

  • Der erste Parameter ist das Wörterbuch mit den Punktzahlen.

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)]

7. Eine Liste von Spielern abrufen, nach Punktzahl absteigend sortiert

Um eine Liste von Spielern zu erhalten, die nach ihren Punktzahlen absteigend sortiert ist, definiere orderByScores, die 1 Parameter entgegennimmt:

  • Der erste Parameter ist das Wörterbuch mit den Punktzahlen.

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)]
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Swift Exercism

Bereit, mit Bestenliste zu starten?

Melde dich bei Exercism an, um Swift mit 35 Konzepte116 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.