Von außen schreibgeschützt
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 18 von 57.
Oft soll Code außerhalb eine Eigenschaft lesen, sie aber nicht ändern. private(set) belässt den Getter auf der normalen Zugriffsebene und macht nur den Setter privat:
struct Counter {
private(set) var count = 0
mutating func increment() {
count += 1
}
}
var c = Counter()
c.increment()
print(c.count)
// c.count = 99 // Fehler: Setter ist privatAusgabe:
1Dies passt zu Werten, die sich nur durch eine Regel ändern dürfen, etwa eine Punktzahl, die durch gültige Aktionen nur steigt:
class Player {
let name: String
private(set) var score = 0
private(set) var history: [Int] = []
init(name: String) { self.name = name }
func award(_ points: Int) {
guard points > 0 else { return }
score += points
history.append(points)
}
}
let p = Player(name: "Ada")
p.award(10)
p.award(-5)
p.award(3)
print(p.score)
print(p.history)Ausgabe:
13
[10, 3]Eine let-Eigenschaft ist für alle schreibgeschützt, sobald die Instanz existiert, einschließlich der eigenen Methoden des Typs. private(set) var bleibt innerhalb des Typs änderbar. Wähle let für Werte, die sich nach der Erstellung nie ändern:
class Order {
let id: Int // ändert sich nie
private(set) var status = "new" // ändert sich, aber nur innerhalb von Order
init(id: Int) { self.id = id }
func ship() { status = "shipped" }
}Eine schreibgeschützte berechnete Eigenschaft ist eine weitere Möglichkeit, Informationen bereitzustellen, ohne Änderungen zuzulassen, da sie überhaupt keinen Setter besitzt:
struct Cart {
private var prices: [Int] = []
var total: Int { prices.reduce(0, +) }
var count: Int { prices.count }
mutating func add(_ price: Int) { prices.append(price) }
}
var cart = Cart()
cart.add(4)
cart.add(6)
print("\(cart.count) items, total \(cart.total)")Ausgabe:
2 items, total 10Aufgabe
EinfachVervollständige die Klasse Elevator. floor und trips können von außerhalb gelesen, aber nur von der Klasse geändert werden (private(set)). goTo(_:) bewegt sich zwischen Etage 0 und topFloor: Eine gültige Bewegung zu einer anderen Etage aktualisiert floor, erhöht trips um 1 und gibt true zurück; eine ungültige Bewegung oder eine Bewegung zur gleichen Etage gibt false zurück.
Der bereitgestellte Code liest die oberste Etage und anschließend die Zielstockwerke ein. Nach einer Bewegung gibt er floor 3 aus oder stay 3, wenn die Bewegung abgelehnt wurde, und schließlich trips: mit der Anzahl.
Dein Code gehört in Elevator.swift. main.swift enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
var input: [String] = []
while let line = readLine() { input.append(line) }
let lift = Elevator(topFloor: Int(input[0])!)
for line in input.dropFirst() {
let moved = lift.goTo(Int(line)!)
print("\(moved ? "floor" : "stay") \(lift.floor)")
}
print("trips: \(lift.trips)")
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 ausleihenÜbe selbstständig: Swift-Playground