willSet va didSet Swift-dagi xususiyat kuzatuvchilari (property observers) bo'lib, qiymat o'zgarishidan oldin va keyin kod bajarish imkonini beradi. Computed properties-dan farqli o'laroq, kuzatuvchilar yangi qiymatni hisoblamaydi, faqat o'zgarishga reaksiya beradi. Apple hujjatlariga ko'ra, The Swift Programming Language (2026), kuzatuvchilar ma'lumotlarni tekshirish, interfeysni sinxronlashtirish va kod o'zgarishlarini qayd etishda ajralmas hisoblanadi.
Asosiy
willSet va didSet Swift-da property observers (xususiyat kuzatuvchilari), stored properties o'zgarishlarini kuzatish uchun o'rnatilgan mexanizmdir.
Boshqa tillardan farqli o'laroq, bu yerda setterlar yoki callback tizimlarini qo'lda amalga oshirish talab qilinmaydi. Swift o'zgarishlarga reaksiya berish uchun deklarativ sintaksis taqdim etadi. Kuzatuvchilar xususiyat e'lonidan so'ng darhol qo'shiladi va alohida chaqirishni talab qilmaydi.
Apple Developer Documentation (2026) ma'lumotiga ko'ra, property observers har qanday sinf, struktura yoki sanab o'tilgan turning stored properties uchun qo'llab-quvvatlanadi. Ular computed properties bilan ishlamaydi, chunki ular qiymatni saqlamaydi — ular uchun o'zgarishga reaksiya to'g'ridan-to'g'ri setterda amalga oshiriladi.
willSet xususiyatga yangi qiymat tayinlanishidan oldin chaqiriladi. willSet ichida o'rnatiladigan qiymatni o'z ichiga olgan yashirin parametr newValue mavjud. Bu vaqtda xususiyatning joriy qiymati hali o'zgarmagan — eski qiymatni to'g'ridan-to'g'ri xususiyat orqali o'qishingiz mumkin.
Swift Evolution proposal SE-0001 (2024) ma'lumotiga ko'ra, willSet haqiqiy o'zgarishdan oldin tekshirish yoki qayd etish imkonini beradi. Agar willSet-da istisno yuzaga kelsa — yangi qiymat qo'llanilmaydi, bu kuzatuvchilarni ma'lumotlarni himoya qilish mexanizmiga aylantiradi.
didSet yangi qiymat tayinlangandan so'ng darhol chaqiriladi. didSet ichida o'zgarishdan oldingi qiymatni o'z ichiga olgan yashirin parametr oldValue mavjud. Bu vaqtda xususiyat allaqachon yangi qiymatni o'z ichiga oladi va uni eski bilan solishtirishingiz mumkin.
Swift by Sundell (2025) ma'lumotiga ko'ra, didSet eng mashhur kuzatuvchi hisoblanadi, chunki u ko'pincha qayta ishlash uchun kerak bo'ladi: UI yangilash, bog'liq maydonlarni qayta hisoblash yoki o'zgarishdan keyin serverga ma'lumot yuborish.
Property observers xususiyatdan so'ng darhol jingalak qavslar yordamida e'lon qilinadi. Minimal sintaksis faqat bitta kuzatuvchini talab qiladi, lekin ikkalasini ham e'lon qilish mumkin.
var score: Int = 0 {
willSet {
print("Ball \(newValue) ga o'zgaradi")
}
didSet {
print("Ball \(oldValue) dan \(score) ga o'zgardi")
}
}
Ikkala kuzatuvchi ham ixtiyoriy — faqat willSet yoki faqat didSet ko'rsatilishi mumkin. willSet uchun newValue nomini qavs ichida nom ko'rsatish orqali o'zgartirish mumkin.
var username: String = "guest" {
willSet(newName) {
print("\(newName) o'rnatilmoqda")
}
didSet(oldName) {
print("\(oldName) edi, hozir \(username)")
}
}
Swift Language Guide (2026) ma'lumotiga ko'ra, parametrlarni nomlash kod o'qilishini yaxshilaydi, ayniqsa xususiyat va kuzatuvchilar uzoq nomlarga ega katta loyihada ishlatilganda.
Bajarish tartibi qat'iy belgilangan: avval willSet (eski qiymat mavjud), keyin tayinlash, so'ng didSet (yangi qiymat mavjud).
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("Harorat \(celsius) dan \(newValue) ga o'zgaradi")
}
didSet {
if celsius > 100.0 {
print("Qaynash nuqtasi oshib ketdi!")
}
}
}
}
Muhim cheklov: kuzatuvchilar misol yaratish jarayonida xususiyatni ishga tushirishda chaqirilmaydi. init ichida qiymat tayinlash willSet va didSet-ni ishga tushirmaydi — bu qurilish bosqichida istalmagan yon ta'sirlarning oldini oladi.
Apple Swift Blog (2025) ma'lumotiga ko'ra, bu xatti-harakat setterlar hatto konstruktorlarda ham chaqiriladigan ko'plab boshqa tillardan farq qiladi. Swift xavfsizlikni tanlaydi: kuzatuvchilar faqat ob'ektni ishga tushirish tugagandan so'ng ishlay boshlaydi.
didSet ichida xususiyatni o'zgartirish kuzatuvchilarning qayta chaqirilishiga olib kelishi mumkin. Swift rekursiyani bloklamaydi — dasturchi uni o'zi boshqarishi kerak.
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
Bunday kod, chiqish sharti ko'zda tutilmagan bo'lsa, to'liq rekursiya va stek to'lib ketishiga olib keladi. Stack Overflow Swift Community (2025) ma'lumotiga ko'ra, bu property observers bilan ishlashda boshlang'ich dasturchilarning eng keng tarqalgan xatolaridan biridir.
Strukturalar stored properties uchun willSet va didSet-ni cheklovlarsiz qo'llab-quvvatlaydi. Shuni yodda tutish kerakki, strukturalar value types hisoblanadi va o'zgartiruvchi metod ichida xususiyatni o'zgartirish ham kuzatuvchilarni ishga tushiradi.
struct Point {
var x: Double = 0.0 {
didSet {
print("X \(x) ga o'zgardi")
}
}
var y: Double = 0.0 {
didSet {
print("Y \(y) ga o'zgardi")
}
}
}
var point = Point()
point.x = 5.0
Xususiyat kuzatuvchilari Swift loyihalarida keng ko'lamli vazifalar uchun ishlatiladi: UI sinxronizatsiyasidan ma'lumotlarni tekshirish va qayd etishgacha.
didSet noto'g'ri qiymatni o'rnatilgandan so'ng darhol qaytarish yoki tuzatish imkonini beradi. Bu Objective-C-dagi katta setterlarni almashtiradi va model darajasida ma'lumotlar yaxlitligini ta'minlaydi.
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
Bog'liq xususiyat o'zgarganda, alohida yangilash metodini chaqirmasdan interfeys elementlarini avtomatik yangilash mumkin.
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet disk raskadrovka yoki audit maqsadida qayd etish uchun qulay. Siz qo'llashdan oldin vaqt va yangi qiymatni yozib olishingiz mumkin, bu esa jurnalning tahlil uchun asl ma'lumotlarni o'z ichiga olishini kafolatlaydi.
objc.io (2025) ma'lumotiga ko'ra, property observers ayniqsa ma'lumotlarning bir yo'nalishli oqimiga ega arxitekturalarda foydalidir, bu erda har bir xususiyat o'zgarishi keyingi holatni qayta tiklash uchun qayd etiladi.
Computed properties qiymatni joyida hisoblaydi va saqlash joyiga ega emas, willSet va didSet esa haqiqiy qiymatga ega stored property ustida ishlaydi.
| Xususiyat | Property Observers | Computed Properties |
|---|---|---|
| Saqlaydi qiymatni | Ha | Yo'q |
| Bajaradi kod o'zgarishda | Ha | Yo'q |
| E'lon turi | var | var (get/set) |
| Kirish parametrlari | newValue, oldValue | newValue (set-da) |
| Ishga tushirish | Boshlang'ich qiymat talab qiladi | Talab qilmaydi |
Asosiy farq: computed property har bir murojaatda qiymatni hisoblaydi, property observer esa mavjud qiymat o'zgarishiga reaksiya beradi. Ularning o'rtasidagi tanlov semantika bilan belgilanadi — agar xususiyat boshqa ma'lumotlarning hosilasi bo'lsa, computed dan foydalaning; agar bu o'zgarishlari kuzatilishi kerak bo'lgan mustaqil qiymat bo'lsa, willSet/didSet dan foydalaning.
Eng keng tarqalgan xato — chiqish shartisiz didSet-ni rekursiv chaqirish. didSet ichida xususiyatning har bir o'zgarishi observer-ni qayta ishga tushiradi, bu esa cheksiz tsiklga olib keladi.
Ikkinchi keng tarqalgan xato — let xususiyatlarida kuzatuvchilardan foydalanishga urinish. Swift kompilyatori xato beradi, chunki let doimiydir.
Uchinchi xato — observer ishga tushirishda chaqirilmasligini e'tiborsiz qoldirish. init ichida willSet ishga tushishini kutayotgan dasturchilar kutilmagan xatti-harakatga duch kelishadi.
To'rtinchi muammo — kuzatuvchilarni extension-dagi xususiyatlarga qo'llash. Swift extension-da stored properties uchun willSet/didSet qo'shishni taqiqlaydi.
Ray Wenderlich (2025) ma'lumotiga ko'ra, bu cheklovlarni tushunish erta bosqichlarda xatolardan qochishga yordam beradi va Swift kodini oldindan bashorat qilish mumkin bo'ladi.
Tez-tez so'raladigan savollar
Ha, har bir kuzatuvchi ixtiyoriy. Siz faqat willSet, faqat didSet yoki ikkalasini birdan e'lon qilishingiz mumkin.
Yo'q, Swift extension-da stored properties uchun willSet va didSet qo'shishni taqiqlaydi. Kuzatuvchilar faqat turning asl ta'rifida e'lon qilinadi.
Yo'q, ishga tushirishda kuzatuvchilar chaqirilmaydi. Bu ob'ektni qurish bosqichida yon ta'sirlarning oldini oladigan himoya mexanizmidir.
willSet stored property kuzatuvchisi bo'lib, qiymat o'zgarishidan oldin bajariladi. Computed property-dagi setter yangi qiymatni hisoblash usulidir, mavjud qiymatni kuzatish emas.
Qayta didSet chaqiruvi rekursiyaga sabab bo'ladi. Chiqish shartisiz bu stek to'lib ketishiga va dasturning avariya bilan tugashiga olib keladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.