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 ș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.
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.
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.
Property observers se declară imediat după proprietate folosind acolade. Sintaxa minimă necesită doar un observator, dar se pot declara ambii.
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.
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.
Ordinea de executare este strict definită: mai întâi willSet (valoarea veche este disponibilă), apoi atribuirea, apoi didSet (valoarea nouă este disponibilă).
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.
Modificarea proprietății în interiorul didSet poate duce la apelarea repetată a observatorilor. Swift nu blochează recurența — programatorul trebuie să o controleze singur.
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.
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.
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
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.
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.
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
La modificarea proprietății asociate, se pot actualiza automat elementele interfeței fără apelarea separată a unei metode de actualizare.
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
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.
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 Observers | Computed Properties |
|---|---|---|
| Stochează valoarea | Da | Nu |
| Execută cod la modificare | Da | Nu |
| Tip de declarare | var | var (get/set) |
| Parametrii de acces | newValue, oldValue | newValue (în set) |
| Inițializare | Necesită 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.
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
Da, fiecare observator este opțional. Puteți declara doar willSet, doar didSet sau ambii simultan.
Nu, Swift interzice adăugarea willSet și didSet în extension pentru stored properties. Observatorii se declară doar în definiția originală a tipului.
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.
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ă.
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
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.
Citiți și