Ö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 -> 15willSet 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 20didSet, 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
0Gö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]Görev
KolayTank 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)")
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
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Özellikleri Derinlemesine İnceleme
Hesaplanan ÖzelliklerÖzellik GözlemcileriStatik ÜyelerMetotlu Enum'larTekrar - Sıcaklık GünlüğüKendi başına pratik yap: Swift playground