Swift-də willSet və didSet: bu nədir, sintaksis və müşahidəçilərin işi

Müəllif: IT Sectr Dərc olunub: 2026-06-20 Oxuma vaxtı: 9 dəq

willSet və didSet Swift-də xüsusiyyət müşahidəçiləridir (property observers) və dəyər dəyişməzdən əvvəl və sonra kod icra etməyə imkan verir. Computed properties-dən fərqli olaraq, müşahidəçilər yeni dəyər hesablamır, yalnız dəyişikliyə reaksiya verir. Apple sənədlərinə görə, The Swift Programming Language (2026), müşahidəçilər məlumat validasiyası, interfeys sinxronizasiyası və kod dəyişikliklərinin loglanması üçün əvəzolunmazdır.

Əsas məqamlar

  • willSet — xüsusiyyətin yeni dəyəri yadda saxlanmazdan əvvəl çağırılır
  • didSet — yeni dəyər yadda saxlandıqdan sonra çağırılır
  • newValue — willSet-də gizli parametr, yeni dəyəri ehtiva edir
  • oldValue — didSet-də gizli parametr, köhnə dəyəri ehtiva edir
  • Müşahidəçilər — inisializasiya zamanı və init daxilində işləmir

Swift-də willSet və didSet nədir?

willSet və didSet Swift-də property observers (xüsusiyyət müşahidəçiləri), stored properties dəyişikliklərini izləmək üçün daxili mexanizmdir.

Digər dillərdən fərqli olaraq, burada setterlərin və ya callback sistemlərinin əl ilə tətbiqi tələb olunmur. Swift dəyişikliklərə reaksiya vermək üçün deklarativ sintaksis təqdim edir. Müşahidəçilər xüsusiyyət bəyannaməsindən dərhal sonra əlavə edilir və ayrıca çağırış tələb etmir.

Apple Developer Documentation (2026) məlumatına görə, property observers istənilən sinif, struktur və ya sadalanmanın stored properties üçün dəstəklənir. Onlar computed properties ilə işləmir, çünki onlar dəyər saxlamır — onlar üçün dəyişikliyə reaksiya birbaşa setterdə tətbiq edilir.

willSet nə vaxt çağırılır

willSet xüsusiyyətə yeni dəyər təyin edilməzdən dərhal əvvəl çağırılır. willSet daxilində təyin ediləcək dəyəri ehtiva edən gizli parametr newValue mövcuddur. Bu anda xüsusiyyətin cari dəyəri hələ dəyişməyib — köhnə dəyəri birbaşa xüsusiyyət vasitəsilə oxuya bilərsiniz.

Swift Evolution proposal SE-0001 (2024) məlumatına görə, willSet faktiki dəyişiklikdən əvvəl validasiya və ya loglama aparmağa imkan verir. Əgər willSet-də istisna atılarsa — yeni dəyər tətbiq edilməyəcək, bu da müşahidəçiləri məlumat mühafizə mexanizminə çevirir.

didSet nə vaxt çağırılır

didSet yeni dəyər təyin edildikdən dərhal sonra çağırılır. didSet daxilində dəyişiklikdən əvvəlki dəyəri ehtiva edən gizli parametr oldValue mövcuddur. Bu anda xüsusiyyət artıq yeni dəyəri ehtiva edir və onu köhnə ilə müqayisə edə bilərsiniz.

Swift by Sundell (2025) məlumatına görə, didSet ən populyar müşahidəçidir, çünki post-emal üçün ən çox tələb olunur: UI yeniləməsi, asılı sahələrin yenidən hesablanması və ya dəyişiklikdən sonra məlumatların serverə göndərilməsi.

Xüsusiyyət müşahidəçilərinin sintaksisi

Property observers xüsusiyyətdən dərhal sonra fiqurlu mötərizələrdən istifadə edərək bəyan edilir. Minimal sintaksis yalnız bir müşahidəçi tələb edir, lakin hər ikisi bəyan edilə bilər.

swift
var score: Int = 0 {
    willSet {
        print("Bal \(newValue) olaraq dəyişəcək")
    }
    didSet {
        print("Bal \(oldValue) dəyərindən \(score) olaraq dəyişdi")
    }
}

Hər iki müşahidəçi isteğe bağlıdır — yalnız willSet və ya yalnız didSet göstərilə bilər. willSet üçün newValue adını dəyişərək mötərizədə ad göstərmək olar.

swift
var username: String = "guest" {
    willSet(newName) {
        print("\(newName) təyin edilmək üzrə")
    }
    didSet(oldName) {
        print("\(oldName) idi, indi \(username)")
    }
}

Swift Language Guide (2026) məlumatına görə, parametrlərin adlandırılması kodun oxunaqlığını artırır, xüsusən xüsusiyyət və müşahidəçilər uzun adlarla böyük layihədə istifadə edildikdə.

willSet və didSet necə işləyir

İcra ardıcıllığı ciddi şəkildə müəyyən edilmişdir: əvvəlcə willSet (köhnə dəyər mövcuddur), sonra təyinat, daha sonra didSet (yeni dəyər mövcuddur).

swift
class Temperature {
    var celsius: Double = 0.0 {
        willSet {
            print("Temperatur \(celsius) dəyərindən \(newValue) olaraq dəyişəcək")
        }
        didSet {
            if celsius > 100.0 {
                print("Qaynama nöqtəsi aşıldı!")
            }
        }
    }
}

Vacib məhdudiyyət: müşahidəçilər nümunə yaradılması zamanı xüsusiyyətin inisializasiyasında çağırılmır. init daxilində dəyər təyinatı willSet və didSet-i tetiklemir — bu, konstruksiya mərhələsində arzuolunmaz yan təsirlərin qarşısını alır.

Apple Swift Blog (2025) məlumatına görə, bu davranış setterlərin hətta konstruktorlarda belə çağırıldığı bir çox digər dillərdən fərqlənir. Swift təhlükəsizliyi seçir: müşahidəçilər obyektin inisializasiyası tamamlandıqdan sonra işləməyə başlayır.

İç-içə çağırışlar və rekursiya

didSet daxilində xüsusiyyətin dəyişdirilməsi müşahidəçilərin təkrar çağırılmasına səbəb ola bilər. Swift rekursiyanı bloklamır — proqramçı onu özü idarə etməlidir.

swift
var counter: Int = 0 {
    didSet {
        if counter < 5 {
            counter += 1
        }
    }
}

Belə kod, çıxış şərti nəzərdə tutulmayıbsa, tam rekursiya və yığın daşması yaradacaq. Stack Overflow Swift Community (2025) məlumatına görə, bu, property observers ilə işləyərkən başlanğıc proqramçıların ən çox yayılmış səhvlərindən biridir.

Strukturların xüsusiyyətləri üçün müşahidəçilər

Strukturlar stored properties üçün willSet və didSet-i məhdudiyyətsiz dəstəkləyir. Yadda saxlamaq lazımdır ki, strukturlar value types-dır və mutasiya edən metod daxilində xüsusiyyətin dəyişdirilməsi də müşahidəçiləri tetikleyir.

swift
struct Point {
    var x: Double = 0.0 {
        didSet {
            print("X \(x) olaraq dəyişdi")
        }
    }
    var y: Double = 0.0 {
        didSet {
            print("Y \(y) olaraq dəyişdi")
        }
    }
}

var point = Point()
point.x = 5.0

Müşahidəçilərin real layihələrdə tətbiqi

Xüsusiyyət müşahidəçiləri Swift layihələrində geniş spektrli tapşırıqlar üçün istifadə olunur: UI sinxronizasiyasından məlumat validasiyasına və loqlama qədər.

Dəyərlərin validasiyası

didSet təyin edildikdən dərhal sonra səhv dəyəri geri qaytarmağa və ya düzəltməyə imkan verir. Bu, Objective-C-dəki yığcam setterləri əvəz edir və model səviyyəsində məlumat bütövlüyünü təmin edir.

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

UI sinxronizasiyası

Əlaqəli xüsusiyyət dəyişdikdə, ayrıca yeniləmə metodu çağırmadan interfeys elementlərini avtomatik yeniləmək olar.

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

Dəyişikliklərin loqlanması

willSet sazlama və ya audit məqsədilə loqlama üçün əlverişlidir. Tətbiq edilməzdən əvvəl vaxtı və yeni dəyəri qeyd edə bilərsiniz, loqun təhlil üçün orijinal məlumatları ehtiva etdiyinə əmin olaraq.

objc.io (2025) məlumatına görə, property observers xüsusilə hər bir xüsusiyyət dəyişikliyinin sonrakı vəziyyətin bərpası üçün qeydə alındığı bir istiqamətli məlumat axını olan arxitekturalarda faydalıdır.

Computed properties ilə müqayisə

Computed properties dəyəri anında hesablayır və yaddaş sahəsinə malik deyil, willSet və didSet isə faktiki dəyəri olan stored property üzərində işləyir.

XüsusiyyətProperty ObserversComputed Properties
Saxlayır dəyəriBəliXeyr
İcra edir kod dəyişiklikdəBəliXeyr
Bəyannamə növüvarvar (get/set)
Giriş parametrlərinewValue, oldValuenewValue (set-də)
İnisializasiyaİlkin dəyər tələb edirTələb etmir

Əsas fərq: computed property hər müraciətdə dəyəri hesablayır, property observer isə mövcud dəyərin dəyişməsinə reaksiya verir. Onların arasında seçim semantika ilə müəyyən edilir — əgər xüsusiyyət digər məlumatların törəməsidirsə, computed istifadə edin; əgər bu, dəyişiklikləri müşahidə edilməli olan müstəqil dəyərdirsə, willSet/didSet istifadə edin.

İstifadə zamanı tipik səhvlər

Ən çox yayılmış səhv — çıxış şərti olmadan didSet-in rekursiv çağırışı. didSet daxilində xüsusiyyətin hər dəyişdirilməsi observer-i təkrar tetikleyir və bu, sonsuz dövrəyə gətirib çıxarır.

İkinci geniş yayılmış səhv — let xüsusiyyətlərində müşahidəçilərdən istifadə cəhdi. Swift kompilyatoru səhv verəcək, çünki let sabitdir.

Üçüncü səhv — observer-in inisializasiya zamanı çağırılmadığını nəzərə almamaq. init daxilində willSet-in işə düşəcəyini gözləyən proqramçılar gözlənilməz davranışla qarşılaşır.

Dördüncü problem — müşahidəçilərin extension-da xüsusiyyətlərə tətbiqi. Swift extension-da stored properties üçün willSet/didSet əlavə etməyi qadağan edir.

Ray Wenderlich (2025) məlumatına görə, bu məhdudiyyətləri başa düşmək erkən mərhələlərdə səhvlərdən qaçmağa kömək edir və Swift kodunu daha proqnozlaşdırıla bilən edir.

Tez-tez verilən suallar

willSet-i didSet olmadan istifadə etmək olar?

Bəli, hər müşahidəçi isteğe bağlıdır. Yalnız willSet, yalnız didSet və ya hər ikisini birdən bəyan edə bilərsiniz.

Müşahidəçilər extension-da işləyir?

Xeyr, Swift extension-da stored properties üçün willSet və didSet əlavə etməyi qadağan edir. Müşahidəçilər yalnız tipin orijinal tərifində bəyan edilir.

Müşahidəçilər init daxilində xüsusiyyət dəyişdirilərkən çağırılır?

Xeyr, inisializasiya zamanı müşahidəçilər çağırılmır. Bu, obyektin qurulması mərhələsində yan təsirlərin qarşısını alan qoruyucu mexanizmdir.

willSet computed property-dəki setter-dən nə ilə fərqlənir?

willSet stored property-nin müşahidəçisidir, dəyər dəyişməzdən əvvəl icra olunur. Computed property-də setter yeni dəyərin hesablanması üsuludur, mövcud dəyərin müşahidəsi deyil.

didSet daxilində xüsusiyyət dəyişdirilərsə nə olar?

Təkrar didSet çağırışı rekursiyaya səbəb olacaq. Çıxış şərti olmadan bu, yığın daşmasına və proqramın qəzaya uğramasına gətirib çıxaracaq.

Nəticə

  • willSet — xüsusiyyət dəyişməzdən əvvəl icra olunan müşahidəçi, newValue-ya çıxış imkanı var
  • didSet — xüsusiyyət dəyişdikdən sonra icra olunan müşahidəçi, oldValue-ya çıxış imkanı var
  • Sintaksis — observers xüsusiyyət bəyannaməsindən sonra fiqurlu mötərizələrdə bəyan edilir
  • İnisializasiya — observers init daxilində və standart dəyər təyin edilərkən işləmir
  • Tətbiq — validasiya, UI sinxronizasiyası, loqlama, dəyişiklik auditi
  • Rekursiya — didSet daxilində xüsusiyyətin dəyişdirilməsi açıq çıxış şərti tələb edir
  • Computed — computed properties ilə qarışdırmayın: observers müşahidə edir, computed hesablayır

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun