Menu
Coddy logo textTech

Özellik Gözlemcileri

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

özellik gözlemcisi, depolanan bir özellik her değiştiğinde kodu çalıştırır. didSet, yeni değer depolandıktan hemen sonra çalışır ve içinde oldValue önceki değeri tutar:

class Player {
    var score = 0 {
        didSet {
            print("score \(oldValue) -> \(score)")
        }
    }
}

let p = Player()
p.score = 10
p.score += 5

Çıktı:

score 0 -> 10
score 10 -> 15

willSet değişiklikten önce, gelen değer newValue olarak çalışır. Özellik başlangıç değerini aldığında gözlemciler çalışmaz:

struct Thermostat {
    var target = 20 {
        willSet { print("changing to \(newValue)") }
        didSet { print("changed from \(oldValue)") }
    }
}

var t = Thermostat()
t.target = 22

Çıktı:

changing to 22
changed from 20

didSet, bir değeri geçerli tutmak için iyi bir yerdir. Özelliğe kendi didSet bloğu içinde değer atamak, gözlemciyi yeniden tetiklemez:

struct Volume {
    var level = 5 {
        didSet {
            if level > 10 { level = 10 }
            if level < 0 { level = 0 }
        }
    }
}

var v = Volume()
v.level = 42
print(v.level)
v.level = -3
print(v.level)

Çıktı:

10
0

Gözlemciler ayrıca bir geçmişi tutabilir veya ilişkili durumu güncelleyebilir; bu da söz konusu mantığı kodun geneline dağılmak yerine özelliğin yanında tutar:

class Account {
    var history: [Int] = []
    var balance = 0 {
        didSet { history.append(balance - oldValue) }
    }
}

let a = Account()
a.balance = 100
a.balance = 70
print(a.history)

Çıktı:

[100, -30]
challenge icon

Görev

Kolay

Tank sınıfını tamamla. Saklanan level özelliği 0 ile capacity arasında kalmalıdır: bu aralığın dışındaki değerleri düzelten ve düzeltilmiş seviye kapasitenin %20'sinin altında kaldığında (ve önceki seviye düşük değilse) alerts'e bir low uyarısı ekleyen bir didSet ekle.

Verilen kod kapasiteyi okur ve ardından +n veya -n değerlerini uygular. Her değişiklikten sonra seviyeyi yazdırır ve son olarak uyarıların sayısıyla birlikte alerts: ifadesini yazdırır.

Kodun Tank.swift dosyasına yazılmalıdır. main.swift verilen girdi/çıktı 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) }
let tank = Tank(capacity: Int(input[0])!)
for cmd in input.dropFirst() {
    let n = Int(cmd.dropFirst())!
    tank.level += cmd.hasPrefix("+") ? n : -n
    print(tank.level)
}
print("alerts: \(tank.alerts.count)")
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