Metody modyfikujące
Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 9 z 57.
Metoda struktury, która zmienia właściwość, musi być oznaczona jako mutating. Bez tego słowa kluczowego metoda się nie kompiluje, ponieważ metody typu wartościowego traktują self jako stałą:
struct Counter {
var count = 0
mutating func increment() {
count += 1
}
}
var c = Counter()
c.increment()
c.increment()
print(c.count)Wynik:
2Metodę modyfikującą można wywołać tylko na var. Wywołanie na stałej let nie kompiluje się, ponieważ cała wartość jest niezmienna:
var a = Counter()
a.increment() // w porządku
let b = Counter()
// b.increment() // błąd: b jest stałą zadeklarowaną za pomocą letMetody, które tylko odczytują właściwości, nie modyfikują danych i działają również na stałych. Dobry projekt ogranicza zmiany do kilku metod modyfikujących:
struct Stack {
var items: [Int] = []
mutating func push(_ x: Int) { items.append(x) }
mutating func pop() -> Int? { items.popLast() }
func peek() -> Int? { items.last }
}
var s = Stack()
s.push(3)
s.push(8)
print(s.pop() ?? -1)
print(s.peek() ?? -1)Wynik:
8
3Metoda modyfikująca może całkowicie zastąpić self, co przydaje się do resetowania wartości:
struct Score {
var points = 0
var bonus = 0
mutating func reset() {
self = Score()
}
}
var s = Score(points: 10, bonus: 3)
s.reset()
print(s.points + s.bonus)Wynik:
0Wyzwanie
ŁatwyUzupełnij strukturę Wallet. Metody add(_:) i spend(_:) są mutujące: spend odejmuje kwotę tylko wtedy, gdy pozostało wystarczająco dużo pieniędzy, i zwraca informację, czy tak się stało. report() nie jest mutująca i zwraca balance 40.
Dostarczony kod odczytuje polecenia +n i -n, stosuje je do jednego portfela var, wypisuje denied w przypadku odmowy wydania pieniędzy, a na koniec wypisuje report().
Twój kod umieść w pliku Wallet.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 wallet = Wallet()
for cmd in input {
let amount = Int(cmd.dropFirst())!
if cmd.hasPrefix("+") {
wallet.add(amount)
} else if !wallet.spend(amount) {
print("denied")
}
}
print(wallet.report())
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