Menu
Coddy logo textTech

Enums mit Methoden

Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 15 von 57.

Ein enum definiert einen Typ mit einer festen Anzahl von Fällen. Werte werden mit einem Punkt geschrieben, und switch muss jeden Fall behandeln. Wenn später ein Fall hinzugefügt wird, zeigt dies jede Stelle, die aktualisiert werden muss:

enum Direction {
    case north, east, south, west
}

let heading = Direction.east
switch heading {
case .north: print("up")
case .east: print("right")
case .south: print("down")
case .west: print("left")
}

Ausgabe:

right

Enums können Methoden und berechnete Eigenschaften haben. In ihnen bezeichnet self den aktuellen Fall:

enum Direction {
    case north, east, south, west

    var turnedRight: Direction {
        switch self {
        case .north: return .east
        case .east: return .south
        case .south: return .west
        case .west: return .north
        }
    }
}

print(Direction.north.turnedRight)
print(Direction.west.turnedRight.turnedRight)

Ausgabe:

east
east

Ein Rohwert weist jedem Fall einen festen Wert eines Typs zu. init(rawValue:) funktioniert umgekehrt und gibt nil zurück, wenn kein Fall übereinstimmt:

enum Size: String {
    case small = "S", medium = "M", large = "L"
}

print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)

Ausgabe:

M
true
true

Zugehörige Werte ermöglichen es jedem Fall, seine eigenen Daten zu tragen. Dadurch kann ein Typ Werte mit unterschiedlicher Struktur enthalten. switch bindet die Daten mit let:

enum Payment {
    case cash(amount: Int)
    case card(number: String, amount: Int)

    var amount: Int {
        switch self {
        case .cash(let amount): return amount
        case .card(_, let amount): return amount
        }
    }
}

let payments: [Payment] = [.cash(amount: 20), .card(number: "4242", amount: 55)]
print(payments.map { $0.amount })

Ausgabe:

[20, 55]
challenge icon

Aufgabe

Einfach

Vervollständige das Enum Command mit den Fällen forward, back, left und right, die auf den Rohwerten F, B, L und R basieren. Füge eine berechnete Eigenschaft step hinzu, die die Änderung der Position zurückgibt: vorwärts 1, zurück -1, links und rechts 0. Vervollständige anschließend run(_:), das jedes Zeichen mit init(rawValue:) in einen Befehl umwandelt (unbekannte Zeichen überspringt) und position 2, turns 1, skipped 1 zurückgibt.

Der bereitgestellte Code liest eine Zeile mit Befehlsbuchstaben ein und gibt das Ergebnis von run(_:) aus.

Dein Code gehört in Command.swift und Functions.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

// Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground