Kontrola dostępu
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 17 z 57.
Hermetyzacja oznacza, że typ kontroluje sposób używania swoich danych. Kontrola dostępu określa, kto może zobaczyć właściwość lub metodę. Oznaczenie składowej jako private ukrywa ją przed całym kodem spoza typu (i jego rozszerzeniami w tym samym pliku):
struct Account {
private var balance = 0
mutating func deposit(_ amount: Int) {
balance += amount
}
}
var a = Account()
a.deposit(50)
// a.balance = 1_000_000 // błąd: 'balance' jest niedostępne ze względu na poziom dostępu 'private'Poza kodem można więc używać tylko tego, co udostępnia typ. Typ może sprawdzać każdą zmianę, dzięki czemu jego dane nigdy nie znajdą się w stanie, na który typ nie zezwala:
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())Wynik:
balance: 50Swift ma pięć poziomów dostępu. Bez słowa kluczowego element ma poziom internal: jest widoczny wszędzie w tym samym module (Twojej aplikacji lub pakiecie). Poziomy od najbardziej otwartego do najbardziej ograniczonego:
open // inne moduły mogą go używać i tworzyć jego podklasy (tylko klasy)
public // inne moduły mogą go używać
internal // domyślnie: cały moduł
fileprivate // tylko ten plik źródłowy
private // ten typ (oraz jego rozszerzenia w tym pliku)Prywatne metody pomocnicze ograniczają publiczny interfejs: wywołujący widzą, co robi typ, a nie jak to robi.
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)Wynik:
true
falseWyzwanie
ŁatwyUzupełnij strukturę Locker. Jej code i items są private. store(_:code:) dodaje element tylko wtedy, gdy kod jest zgodny, i zwraca informację, czy go dodano; items(code:) zwraca zapisane elementy połączone za pomocą , (lub empty), gdy kod jest zgodny, a w przeciwnym razie wrong code.
Dostarczony kod odczytuje kod skrytki, a następnie polecenia put <code> <item> lub open <code>. Dla każdego polecenia put wypisuje stored lub denied, a dla każdego polecenia open — wynik.
Twój kod umieść w pliku Locker.swift. Plik main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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]))
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasMetody i selfInicjalizatoryKlasy są referencjamiPowtórzenie — karta biblioteczna4Hermetyzacja
Kontrola dostępuTylko do odczytu z zewnątrzOchrona stanuInicjalizatory, które mogą zawieśćPodsumowanie — konto bankowe7Polimorfizm i typy generyczne
PolimorfizmRzutowanie typówFunkcje generyczneTypy generycznePodsumowanie – kalkulator kształtów2Struktury i typy wartościowe
StrukturySemantyka wartościMetody modyfikująceStruktura czy klasaPodsumowanie – element inwentarza5Dziedziczenie
PodklasyPrzesłanianie metodInicjalizatory i superfinal i hierarchiePodsumowanie — hierarchia pracowników8Standardowe protokoły
CustomStringConvertibleEquatableComparableHashablePodsumowanie — własne sortowanie11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Swift