Swift-da willSet va didSet: bu nima, sintaksis va kuzatuvchilarning ishlashi

Muallif: IT Sectr Nashr etilgan: 2026-06-20 O'qish vaqti: 9 daq

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 — xususiyatning yangi qiymati saqlanishidan oldin chaqiriladi
  • didSet — yangi qiymat saqlangandan keyin chaqiriladi
  • newValue — willSet-dagi yashirin parametr, yangi qiymatni o'z ichiga oladi
  • oldValue — didSet-dagi yashirin parametr, eski qiymatni o'z ichiga oladi
  • Kuzatuvchilar — ishga tushirishda va init ichida ishlamaydi

Swift-da willSet va didSet nima?

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 qachon chaqiriladi

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 qachon chaqiriladi

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.

Xususiyat kuzatuvchilarining sintaksisi

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.

swift
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.

swift
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.

willSet va didSet qanday ishlaydi

Bajarish tartibi qat'iy belgilangan: avval willSet (eski qiymat mavjud), keyin tayinlash, so'ng didSet (yangi qiymat mavjud).

swift
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.

Ichma-ich chaqiruvlar va rekursiya

didSet ichida xususiyatni o'zgartirish kuzatuvchilarning qayta chaqirilishiga olib kelishi mumkin. Swift rekursiyani bloklamaydi — dasturchi uni o'zi boshqarishi kerak.

swift
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.

Struktura xususiyatlari uchun kuzatuvchilar

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.

swift
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

Kuzatuvchilarning real loyihalarda qo'llanilishi

Xususiyat kuzatuvchilari Swift loyihalarida keng ko'lamli vazifalar uchun ishlatiladi: UI sinxronizatsiyasidan ma'lumotlarni tekshirish va qayd etishgacha.

Qiymatlarni tekshirish

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.

swift
var age: Int = 0 {
    didSet {
        if age < 0 || age > 150 {
            age = oldValue
        }
    }
}

UI sinxronizatsiyasi

Bog'liq xususiyat o'zgarganda, alohida yangilash metodini chaqirmasdan interfeys elementlarini avtomatik yangilash mumkin.

swift
var userName: String = "" {
    didSet {
        nameLabel.text = userName
    }
}

O'zgarishlarni qayd etish

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 bilan solishtirish

Computed properties qiymatni joyida hisoblaydi va saqlash joyiga ega emas, willSet va didSet esa haqiqiy qiymatga ega stored property ustida ishlaydi.

XususiyatProperty ObserversComputed Properties
Saqlaydi qiymatniHaYo'q
Bajaradi kod o'zgarishdaHaYo'q
E'lon turivarvar (get/set)
Kirish parametrlarinewValue, oldValuenewValue (set-da)
Ishga tushirishBoshlang'ich qiymat talab qiladiTalab 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.

Foydalanishdagi odatiy xatolar

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

willSet-ni didSetsiz ishlatish mumkinmi?

Ha, har bir kuzatuvchi ixtiyoriy. Siz faqat willSet, faqat didSet yoki ikkalasini birdan e'lon qilishingiz mumkin.

Kuzatuvchilar extension-da ishlaydimi?

Yo'q, Swift extension-da stored properties uchun willSet va didSet qo'shishni taqiqlaydi. Kuzatuvchilar faqat turning asl ta'rifida e'lon qilinadi.

Kuzatuvchilar init ichida xususiyat o'zgartirilganda chaqiriladimi?

Yo'q, ishga tushirishda kuzatuvchilar chaqirilmaydi. Bu ob'ektni qurish bosqichida yon ta'sirlarning oldini oladigan himoya mexanizmidir.

willSet computed property-dagi setterdan nimasi bilan farq qiladi?

willSet stored property kuzatuvchisi bo'lib, qiymat o'zgarishidan oldin bajariladi. Computed property-dagi setter yangi qiymatni hisoblash usulidir, mavjud qiymatni kuzatish emas.

didSet ichida xususiyat o'zgartirilsa nima bo'ladi?

Qayta didSet chaqiruvi rekursiyaga sabab bo'ladi. Chiqish shartisiz bu stek to'lib ketishiga va dasturning avariya bilan tugashiga olib keladi.

Xulosa

  • willSet — xususiyat o'zgarishidan oldin bajariladigan kuzatuvchi, newValue ga kirish imkoniyati bilan
  • didSet — xususiyat o'zgarishidan keyin bajariladigan kuzatuvchi, oldValue ga kirish imkoniyati bilan
  • Sintaksis — observers xususiyat e'lonidan keyin jingalak qavslarda e'lon qilinadi
  • Ishga tushirish — observers init ichida va standart qiymat o'rnatilganda ishlamaydi
  • Qo'llanish — tekshirish, UI sinxronizatsiyasi, qayd etish, o'zgarishlar auditi
  • Rekursiya — didSet ichida xususiyatni o'zgartirish aniq chiqish shartini talab qiladi
  • Computed — computed properties bilan aralashtirmang: observers kuzatadi, computed hisoblaydi

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.

Loyihani muhokama qilish

Shuningdek o'qing