Eigenschaftsbeobachter
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 13 von 57.
Ein Property-Observer führt Code aus, sobald sich eine gespeicherte Eigenschaft ändert. didSet wird direkt ausgeführt, nachdem der neue Wert gespeichert wurde, und darin enthält oldValue den vorherigen Wert:
class Player {
var score = 0 {
didSet {
print("score \(oldValue) -> \(score)")
}
}
}
let p = Player()
p.score = 10
p.score += 5Ausgabe:
score 0 -> 10
score 10 -> 15willSet wird vor der Änderung ausgeführt, wobei der eingehende Wert als newValue vorliegt. Beobachter werden nicht ausgeführt, wenn die Eigenschaft ihren Anfangswert erhält:
struct Thermostat {
var target = 20 {
willSet { print("changing to \(newValue)") }
didSet { print("changed from \(oldValue)") }
}
}
var t = Thermostat()
t.target = 22Ausgabe:
changing to 22
changed from 20didSet ist ein guter Ort, um einen Wert gültig zu halten. Eine Zuweisung an die Eigenschaft innerhalb ihres eigenen didSet löst den Beobachter nicht erneut aus:
struct Volume {
var level = 5 {
didSet {
if level > 10 { level = 10 }
if level < 0 { level = 0 }
}
}
}
var v = Volume()
v.level = 42
print(v.level)
v.level = -3
print(v.level)Ausgabe:
10
0Beobachter können auch einen Verlauf führen oder einen verwandten Zustand aktualisieren. Dadurch bleibt diese Logik direkt neben der Eigenschaft, anstatt über den Code verstreut zu sein:
class Account {
var history: [Int] = []
var balance = 0 {
didSet { history.append(balance - oldValue) }
}
}
let a = Account()
a.balance = 100
a.balance = 70
print(a.history)Ausgabe:
[100, -30]Aufgabe
EinfachVervollständige die Klasse Tank. Ihre gespeicherte Eigenschaft level muss zwischen 0 und capacity bleiben: Füge ein didSet hinzu, das Werte außerhalb dieses Bereichs korrigiert und eine Warnung low an alerts anhängt, sobald der korrigierte Füllstand unter 20 % der Kapazität liegt (und der vorherige Füllstand nicht niedrig war).
Der bereitgestellte Code liest die Kapazität ein und ändert anschließend +n oder -n. Er gibt den Füllstand nach jeder Änderung aus und schließlich alerts: mit der Anzahl der Warnungen.
Dein Code gehört in Tank.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf 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) }
let tank = Tank(capacity: Int(input[0])!)
for cmd in input.dropFirst() {
let n = Int(cmd.dropFirst())!
tank.level += cmd.hasPrefix("+") ? n : -n
print(tank.level)
}
print("alerts: \(tank.alerts.count)")
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