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:
rightEnums 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
eastEin 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
trueZugehö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]Aufgabe
EinfachVervollstä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]))
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Eigenschaften im Detail
Berechnete EigenschaftenEigenschaftsbeobachterStatische MemberEnums mit MethodenRückblick – TemperaturprotokollÜbe selbstständig: Swift-Playground