willSet și didSet în Swift: ce sunt, sintaxa și cum funcționează observatorii

Autor: IT Sectr Publicat: 2026-06-20 Timp de citire: 9 min

willSet și didSet sunt observatori de proprietate (property observers) în Swift care permit executarea de cod înainte și după modificarea valorii unei proprietăți. Spre deosebire de computed properties, observatorii nu calculează o valoare nouă, ci doar reacționează la schimbare. Conform documentației Apple, The Swift Programming Language (2026), observatorii sunt de neînlocuit la validarea datelor, sincronizarea interfeței și logarea modificărilor în cod.

Principalele puncte

  • willSet — este apelat înainte de salvarea noii valori a proprietății
  • didSet — este apelat după salvarea noii valori
  • newValue — parametru implicit în willSet, conține noua valoare
  • oldValue — parametru implicit în didSet, conține vechea valoare
  • Observatorii — nu funcționează la inițializare și în interiorul init

Ce sunt willSet și didSet în Swift?

willSet și didSet sunt property observers (observatori de proprietate) în Swift, un mecanism încorporat de urmărire a modificărilor stored properties.

Spre deosebire de alte limbaje unde este necesară implementarea manuală a setterelor sau sistemelor de callback, Swift oferă o sintaxă declarativă pentru reacția la schimbări. Observatorii se adaugă direct după declararea proprietății și nu necesită o apelare separată.

Conform Apple Developer Documentation (2026), property observers sunt suportați pentru stored properties ale oricărei clase, structuri sau enumerări. Ei nu funcționează cu computed properties, deoarece acestea nu stochează valoarea — pentru ele reacția la schimbare se implementează direct în setter.

Când este apelat willSet

willSet este apelat imediat înainte de atribuirea noii valori proprietății. În interiorul willSet este disponibil parametrul implicit newValue, care conține valoarea ce va fi setată. În acest moment valoarea curentă a proprietății nu s-a schimbat încă — puteți citi vechea valoare direct prin proprietate.

Conform Swift Evolution proposal SE-0001 (2024), willSet oferă posibilitatea de a efectua validare sau logare înainte de modificarea efectivă. Dacă în willSet este aruncată o excepție — noua valoare nu se va aplica, ceea ce face observatorii un mecanism de protecție a datelor.

Când este apelat didSet

didSet este apelat imediat după atribuirea noii valori. În interiorul didSet este disponibil parametrul implicit oldValue, care conține valoarea de dinaintea modificării. În acest moment proprietatea conține deja noua valoare și o puteți compara cu cea veche.

Conform Swift by Sundell (2025), didSet este cel mai popular observator, deoarece este cel mai des necesar pentru post-procesare: actualizarea UI, recalcularea câmpurilor dependente sau trimiterea datelor pe server după modificare.

Sintaxa observatorilor de proprietate

Property observers se declară imediat după proprietate folosind acolade. Sintaxa minimă necesită doar un observator, dar se pot declara ambii.

swift
var score: Int = 0 {
    willSet {
        print("Scorul se va schimba în \(newValue)")
    }
    didSet {
        print("Scorul s-a schimbat de la \(oldValue) la \(score)")
    }
}

Ambii observatori sunt opționali — se poate specifica doar willSet sau doar didSet. Pentru willSet se poate redenumi newValue, specificând numele în paranteze.

swift
var username: String = "guest" {
    willSet(newName) {
        print("Urmează să setez \(newName)")
    }
    didSet(oldName) {
        print("A fost \(oldName), acum \(username)")
    }
}

Conform Swift Language Guide (2026), redenumirea parametrilor îmbunătățește lizibilitatea codului, în special când proprietatea și observatorii sunt utilizați într-un proiect mare cu nume lungi.

Cum funcționează willSet și didSet

Ordinea de executare este strict definită: mai întâi willSet (valoarea veche este disponibilă), apoi atribuirea, apoi didSet (valoarea nouă este disponibilă).

swift
class Temperature {
    var celsius: Double = 0.0 {
        willSet {
            print("Temperatura se va schimba de la \(celsius) la \(newValue)")
        }
        didSet {
            if celsius > 100.0 {
                print("Punctul de fierbere a fost depășit!")
            }
        }
    }
}

Limitare importantă: observatorii nu sunt apelați la inițializarea proprietății în procesul de creare a instanței. În interiorul init, atribuirea valorii nu declanșează willSet și didSet — aceasta previne efectele secundare nedorite în etapa de construcție.

Conform Apple Swift Blog (2025), acest comportament diferă de multe alte limbaje unde setterele sunt apelate chiar și în constructori. Swift alege siguranța: observatorii încep să funcționeze doar după finalizarea inițializării obiectului.

Apeluri imbricate și recurență

Modificarea proprietății în interiorul didSet poate duce la apelarea repetată a observatorilor. Swift nu blochează recurența — programatorul trebuie să o controleze singur.

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

Un astfel de cod va crea o recurență totală cu depășirea stivei, dacă nu este prevăzută o condiție de ieșire. Conform Stack Overflow Swift Community (2025), aceasta este una dintre cele mai frecvente greșeli ale programatorilor începători la lucrul cu property observers.

Observatori pentru proprietățile structurilor

Structurile suportă willSet și didSet pentru stored properties fără restricții. Este important de reținut că structurile sunt value types, iar modificarea proprietății în interiorul unei metode mutante declanșează și ea observatorii.

swift
struct Point {
    var x: Double = 0.0 {
        didSet {
            print("X s-a schimbat în \(x)")
        }
    }
    var y: Double = 0.0 {
        didSet {
            print("Y s-a schimbat în \(y)")
        }
    }
}

var point = Point()
point.x = 5.0

Aplicarea observatorilor în proiecte reale

Observatorii de proprietate sunt utilizați în proiectele Swift pentru un spectru larg de sarcini: de la sincronizarea UI până la validarea datelor și logare.

Validarea valorilor

didSet permite anularea sau corectarea unei valori incorecte imediat după setarea acesteia. Acest lucru înlocuiește setterele voluminoase din Objective-C și asigură integritatea datelor la nivel de model.

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

Sincronizarea UI

La modificarea proprietății asociate, se pot actualiza automat elementele interfeței fără apelarea separată a unei metode de actualizare.

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

Logarea modificărilor

willSet este convenabil pentru logare în scopuri de depanare sau audit. Puteți înregistra timpul și noua valoare înainte de aplicarea acesteia, garantând că logul conține datele originale pentru analiză.

Conform objc.io (2025), property observers sunt deosebit de utili în arhitecturile cu flux de date unidirecțional, unde fiecare modificare a proprietății este înregistrată pentru reproducerea ulterioară a stării.

Comparație cu computed properties

Computed properties calculează valoarea pe loc și nu au stocare, în timp ce willSet și didSet funcționează pe stored property cu o valoare reală.

CaracteristicăProperty ObserversComputed Properties
Stochează valoareaDaNu
Execută cod la modificareDaNu
Tip de declararevarvar (get/set)
Parametrii de accesnewValue, oldValuenewValue (în set)
InițializareNecesită valoare inițialăNu necesită

Diferența cheie: computed property calculează valoarea la fiecare accesare, iar property observer reacționează la modificarea valorii existente. Alegerea între ele este dictată de semantică — dacă proprietatea este derivată din alte date, folosiți computed; dacă este o valoare independentă ale cărei modificări trebuie observate, folosiți willSet/didSet.

Erori tipice la utilizare

Cea mai frecventă eroare — apelarea recursivă a didSet fără o condiție de ieșire. Fiecare modificare a proprietății în interiorul didSet declanșează din nou observer-ul, ceea ce duce la o buclă infinită.

A doua eroare comună — încercarea de a folosi observatori pe proprietăți let. Compilatorul Swift va genera o eroare, deoarece let este o constantă.

A treia eroare — ignorarea faptului că observer-ul nu este apelat la inițializare. Dezvoltatorii care se așteaptă la declanșarea willSet în interiorul init au parte de un comportament neașteptat.

A patra problemă — aplicarea observatorilor la proprietăți în extension. Swift interzice adăugarea willSet/didSet la stored properties în extension.

Conform Ray Wenderlich (2025), înțelegerea acestor limitări ajută la evitarea bug-urilor în etapele timpurii și face codul în Swift mai previzibil.

Întrebări frecvente

Pot folosi willSet fără didSet?

Da, fiecare observator este opțional. Puteți declara doar willSet, doar didSet sau ambii simultan.

Funcționează observatorii în extension?

Nu, Swift interzice adăugarea willSet și didSet în extension pentru stored properties. Observatorii se declară doar în definiția originală a tipului.

Sunt apelați observatorii la modificarea proprietății în interiorul init?

Nu, la inițializare observatorii nu sunt apelați. Este un mecanism de protecție care previne efectele secundare în etapa de construcție a obiectului.

Prin ce diferă willSet de setter-ul din computed property?

willSet este un observator al stored property executat înainte de modificarea valorii. Setter-ul din computed property este o modalitate de a calcula o valoare nouă, nu de a observa una existentă.

Ce se întâmplă la modificarea proprietății în interiorul didSet?

Apelarea repetată a didSet va provoca recurență. Fără o condiție de ieșire, aceasta duce la depășirea stivei și terminarea avariată a programului.

Rezumat

  • willSet — observator executat înainte de modificarea proprietății, cu acces la newValue
  • didSet — observator executat după modificarea proprietății, cu acces la oldValue
  • Sintaxa — observers se declară în acolade după declararea proprietății
  • Inițializare — observers nu funcționează în interiorul init și la setarea valorii implicite
  • Aplicare — validare, sincronizare UI, logare, audit al schimbărilor
  • Recurență — modificarea proprietății în interiorul didSet necesită o condiție de ieșire explicită
  • Computed — nu confundați cu computed properties: observers observă, computed calculează

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și