Menu
CoddyTech

Pengamat Properti

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 13 dari 57.

Observer property menjalankan kode setiap kali stored property berubah. didSet berjalan tepat setelah nilai baru disimpan, dan di dalamnya oldValue menyimpan nilai sebelumnya:

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

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

Output:

score 0 -> 10
score 10 -> 15

willSet berjalan sebelum perubahan, dengan nilai yang masuk sebagai newValue. Observer tidak berjalan saat property mendapatkan nilai awalnya:

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

var t = Thermostat()
t.target = 22

Output:

changing to 22
changed from 20

didSet adalah tempat yang baik untuk menjaga agar nilai tetap valid. Menetapkan nilai ke property di dalam didSet miliknya sendiri tidak memicu observer lagi:

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)

Output:

10
0

Observer juga dapat menyimpan riwayat atau memperbarui state terkait, sehingga logika tersebut tetap berada di dekat property alih-alih tersebar di dalam kode:

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)

Output:

[100, -30]
challenge icon

Tantangan

Mudah

Lengkapi class Tank. Property tersimpan level harus tetap berada di antara 0 dan capacity: tambahkan didSet yang mengoreksi nilai di luar rentang tersebut, dan menambahkan peringatan low ke alerts setiap kali level yang sudah dikoreksi berada di bawah 20% dari kapasitas (dan level sebelumnya tidak rendah).

Code yang disediakan membaca kapasitas lalu mengubah nilai dengan +n atau -n. Code tersebut mencetak level setelah setiap perubahan, lalu mencetak alerts: beserta jumlah peringatannya.

Tulis kodemu di Tank.swift. main.swift berisi code input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan tetap seperti ini
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift