Menu
Coddy logo textTech

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änglich

Code 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: 50

Swift 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
false
challenge icon

Aufgabe

Einfach

Vervollstä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]))
    }
}
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