Menu
Coddy logo textTech

Değiştirici Metotlar

Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 9 / 57.

Bir özelliği değiştiren struct metodu mutating olarak işaretlenmelidir. Bu anahtar kelime olmadan metot derlenmez, çünkü bir değer türünün metotları self ifadesini sabit olarak ele alır:

struct Counter {
    var count = 0

    mutating func increment() {
        count += 1
    }
}

var c = Counter()
c.increment()
c.increment()
print(c.count)

Çıktı:

2

Değiştirici bir yöntem yalnızca var üzerinde çağrılabilir. Bir let sabitinde çağrı derlenmez, çünkü değerin tamamı sabittir:

var a = Counter()
a.increment()        // iyi

let b = Counter()
// b.increment()     // hata: b bir let sabiti

Yalnızca özellikleri okuyan yöntemler değişmez kalır ve sabitlerle de çalışır. İyi bir tasarım, değişiklikleri birkaç değiştirici yöntemde tutar:

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)

Çıktı:

8
3

Değiştirici bir yöntem, self değerini tamamen değiştirebilir; bu, bir değeri sıfırlamak için kullanışlıdır:

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)

Çıktı:

0
challenge icon

Görev

Kolay

Wallet struct'ını tamamlayın. add(_:) ve spend(_:) değiştiricidir: spend yalnızca yeterli para kaldığında çıkarma yapar ve bunu yapıp yapmadığını döndürür. report() değiştirici değildir ve balance 40 döndürür.

Sağlanan kod +n ve -n komutlarını okur, bunları tek bir var wallet'ına uygular, reddedilen harcamalar için denied yazdırır ve son olarak report() çıktısını yazdırır.

Kodunuz Wallet.swift dosyasına yazılmalıdır. main.swift sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Swift playground