Zugriffskontrolle
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 17 von 57.
Kapselung bedeutet, dass ein Typ kontrolliert, wie seine Daten verwendet werden können. Die Zugriffskontrolle legt fest, wer eine Eigenschaft oder Methode sehen kann. Wenn ein Member als private markiert wird, ist er für sämtlichen Code außerhalb des Typs (und seiner Erweiterungen in derselben Datei) verborgen:
struct Account {
private var balance = 0
mutating func deposit(_ amount: Int) {
balance += amount
}
}
var a = Account()
a.deposit(50)
// a.balance = 1_000_000 // Fehler: 'balance' ist aufgrund des 'private'-Schutzlevels nicht zugänglichCode außerhalb kann dann nur das verwenden, was der Typ anbietet. Der Typ kann jede Änderung überprüfen, sodass seine Daten niemals in einen Zustand geraten, den der Typ nicht zulässt:
struct Account {
private var balance = 0
mutating func deposit(_ amount: Int) {
if amount > 0 { balance += amount }
}
func report() -> String {
"balance: \(balance)"
}
}
var a = Account()
a.deposit(50)
a.deposit(-999)
print(a.report())Ausgabe:
balance: 50Swift hat fünf Zugriffsebenen. Ohne ein Schlüsselwort ist ein Member internal: überall im selben Modul sichtbar (deine App oder dein Paket). Die Ebenen von den offensten bis zu den eingeschränktesten:
open // andere Module können es verwenden und davon erben (nur Klassen)
public // andere Module können es verwenden
internal // Standard: das gesamte Modul
fileprivate // nur diese Quelldatei
private // dieser Typ (und seine Erweiterungen in der Datei)Private Hilfsmethoden halten die öffentliche Schnittstelle klein: Aufrufer sehen, was der Typ tut, nicht, wie er es tut.
struct Password {
private let text: String
init(_ text: String) { self.text = text }
var isStrong: Bool {
hasDigit() && text.count >= 8
}
private func hasDigit() -> Bool {
text.contains { $0.isNumber }
}
}
print(Password("secret123").isStrong)
print(Password("short1").isStrong)Ausgabe:
true
falseAufgabe
EinfachVervollständige die Struktur Locker. Ihre code und items sind private. store(_:code:) fügt ein Element nur hinzu, wenn der Code übereinstimmt, und gibt zurück, ob dies der Fall war; items(code:) gibt die gespeicherten Elemente, verbunden mit , (oder empty), zurück, wenn der Code übereinstimmt, und andernfalls wrong code.
Der bereitgestellte Code liest den Code des Schließfachs ein und verarbeitet anschließend die Befehle put <code> <item> oder open <code>. Für jedes put gibt er stored oder denied aus und für jedes open das Ergebnis.
Dein Code gehört in Locker.swift. main.swift enthält den bereitgestellten Eingabe-/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) }
var locker = Locker(code: input[0])
for cmd in input.dropFirst() {
let p = cmd.split(separator: " ").map(String.init)
if p[0] == "put" {
print(locker.store(p[2], code: p[1]) ? "stored" : "denied")
} else {
print(locker.items(code: p[1]))
}
}
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