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 += 5Output:
score 0 -> 10
score 10 -> 15willSet 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 = 22Output:
changing to 22
changed from 20didSet 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
0Observer 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]Tantangan
MudahLengkapi 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)")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift