Menu
Coddy logo textTech

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:

2

Metodę 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ą let

Metody, 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
3

Metoda 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:

0
challenge icon

Wyzwanie

Łatwy

Uzupeł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())
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Swift