willSet és didSet tulajdonságmegfigyelők (property observers) Swiftben, amelyek lehetővé teszik kód futtatását a tulajdonság értékének megváltoztatása előtt és után. A computed properties-szel ellentétben a megfigyelők nem számítanak ki új értéket, csak reagálnak a változásra. Az Apple dokumentációja szerint, The Swift Programming Language (2026), a megfigyelők nélkülözhetetlenek az adatok érvényesítésében, a felület szinkronizálásában és a kódváltozások naplózásában.
Főbb pontok
willSet és didSet property observers (tulajdonságmegfigyelők) Swiftben, beépített mechanizmus a stored properties változásainak nyomon követésére.
Ellentétben más nyelvekkel, ahol a setterek vagy callback rendszerek kézi megvalósítása szükséges, a Swift deklaratív szintaxist biztosít a változásokra való reagáláshoz. A megfigyelők közvetlenül a tulajdonság deklarálása után kerülnek hozzáadásra, és nem igényelnek külön hívást.
Az Apple Developer Documentation (2026) szerint a property observers bármely osztály, struktúra vagy felsorolás stored properties-eihez támogatott. Nem működnek computed properties-szel, mert azok nem tárolnak értéket — számukra a változásra adott reakció közvetlenül a setterben valósul meg.
willSet közvetlenül az új érték tulajdonsághoz rendelése előtt hívódik meg. A willSet-ben elérhető az implicit newValue paraméter, amely a beállítandó értéket tartalmazza. Ebben a pillanatban a tulajdonság aktuális értéke még nem változott meg — a régi értéket közvetlenül a tulajdonságon keresztül olvashatja.
A Swift Evolution proposal SE-0001 (2024) szerint a willSet lehetőséget biztosít érvényesítésre vagy naplózásra a tényleges változás előtt. Ha a willSet-ben kivétel dobódik — az új érték nem kerül alkalmazásra, ami a megfigyelőket adatvédelmi mechanizmussá teszi.
didSet közvetlenül az új érték hozzárendelése után hívódik meg. A didSet-ben elérhető az implicit oldValue paraméter, amely a változás előtti értéket tartalmazza. Ebben a pillanatban a tulajdonság már az új értéket tartalmazza, és összehasonlíthatja a régivel.
A Swift by Sundell (2025) szerint a didSet a legnépszerűbb megfigyelő, mert leggyakrabban az utófeldolgozáshoz szükséges: UI frissítése, függő mezők újraszámítása vagy adatok szerverre küldése a változás után.
A property observers közvetlenül a tulajdonság után deklarálódik kapcsos zárójelek használatával. A minimális szintaxis csak egy megfigyelőt igényel, de mindkettő deklarálható.
var score: Int = 0 {
willSet {
print("A pontszám erre változik: \(newValue)")
}
didSet {
print("A pontszám ennyiről: \(oldValue) ennyire változott: \(score)")
}
}
Mindkét megfigyelő opcionális — csak willSet vagy csak didSet adható meg. A willSet esetén a newValue átnevezhető a név zárójelben történő megadásával.
var username: String = "guest" {
willSet(newName) {
print("\(newName) beállítása")
}
didSet(oldName) {
print("\(oldName) volt, most \(username)")
}
}
A Swift Language Guide (2026) szerint a paraméterek átnevezése javítja a kód olvashatóságát, különösen ha a tulajdonságot és a megfigyelőket hosszú nevű nagy projektben használják.
A végrehajtás sorrendje szigorúan meghatározott: először willSet (a régi érték elérhető), majd hozzárendelés, aztán didSet (az új érték elérhető).
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("A hőmérséklet \(celsius)-ról \(newValue)-ra változik")
}
didSet {
if celsius > 100.0 {
print("A forráspont túl lett lépve!")
}
}
}
}
Fontos korlátozás: a megfigyelők nem hívódnak meg a tulajdonság inicializálásakor a példány létrehozása során. Az init-en belül az érték hozzárendelése nem váltja ki a willSet-et és didSet-et — ez megakadályozza a nem kívánt mellékhatásokat a konstrukciós szakaszban.
Az Apple Swift Blog (2025) szerint ez a viselkedés eltér sok más nyelvtől, ahol a setterek még a konstruktorokban is meghívódnak. Swift a biztonságot választja: a megfigyelők csak az objektum inicializálásának befejezése után kezdenek el működni.
A tulajdonság megváltoztatása a didSet-ben a megfigyelők ismételt meghívásához vezethet. A Swift nem blokkolja a rekurziót — a programozónak kell azt vezérelnie.
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
Az ilyen kód teljes rekurziót hoz létre verem túlcsordulással, ha nincs kilépési feltétel. A Stack Overflow Swift Community (2025) szerint ez az egyik leggyakoribb hiba kezdő programozóknál a property observers-szel való munka során.
A struktúrák korlátozás nélkül támogatják a willSet és didSet használatát stored properties esetén. Fontos megjegyezni, hogy a struktúrák értéktípusok (value types), és a tulajdonság módosítása egy mutating metóduson belül szintén kiváltja a megfigyelőket.
struct Point {
var x: Double = 0.0 {
didSet {
print("X \(x)-ra változott")
}
}
var y: Double = 0.0 {
didSet {
print("Y \(y)-ra változott")
}
}
}
var point = Point()
point.x = 5.0
A tulajdonságmegfigyelőket Swift-projektekben a feladatok széles skálájára használják: az UI-szinkronizációtól az adatok érvényesítéséig és naplózásig.
didSet lehetővé teszi az érvénytelen érték visszavonását vagy korrigálását közvetlenül a beállítás után. Ez helyettesíti az Objective-C körülményes setterjeit, és biztosítja az adatok integritását a modell szintjén.
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
A kapcsolódó tulajdonság megváltozásakor a felület elemei automatikusan frissíthetők külön frissítési metódus meghívása nélkül.
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet kényelmes naplózáshoz hibakeresés vagy audit céljából. Rögzítheti az időt és az új értéket az alkalmazás előtt, garantálva, hogy a napló tartalmazza az eredeti adatokat az elemzéshez.
Az objc.io (2025) szerint a property observers különösen hasznosak az egyirányú adatfolyammal rendelkező architektúrákban, ahol minden tulajdonságváltozást rögzítenek az állapot későbbi reprodukálásához.
A computed properties menet közben számítják ki az értéket, és nincs tárolójuk, míg a willSet és didSet egy stored property-n dolgozik tényleges értékkel.
| Jellemző | Property Observers | Computed Properties |
|---|---|---|
| Tárolja az értéket | Igen | Nem |
| Végrehajt kódot változáskor | Igen | Nem |
| Deklaráció típusa | var | var (get/set) |
| Hozzáférési paraméterek | newValue, oldValue | newValue (a set-ben) |
| Inicializálás | Kezdőértéket igényel | Nem igényel |
A legfontosabb különbség: a computed property minden eléréskor kiszámítja az értéket, míg a property observer a meglévő érték változására reagál. A köztük lévő választást a szemantika diktálja — ha a tulajdonság más adatokból származik, használjon computed; ha ez egy független érték, amelynek változásait meg kell figyelni, használjon willSet/didSet.
A leggyakoribb hiba — a didSet rekurzív meghívása kilépési feltétel nélkül. A tulajdonság minden megváltoztatása a didSet-ben újra kiváltja az observer-t, ami végtelen ciklushoz vezet.
A második gyakori hiba — a megfigyelők használatának kísérlete let tulajdonságokon. A Swift fordító hibát ad, mivel a let konstans.
A harmadik hiba — annak figyelmen kívül hagyása, hogy az observer nem hívódik meg inicializáláskor. Azok a fejlesztők, akik a willSet init-en belüli aktiválódását várják, váratlan viselkedést tapasztalnak.
A negyedik probléma — a megfigyelők alkalmazása extension-ben lévő tulajdonságokra. A Swift tiltja a willSet/didSet hozzáadását stored properties-hez extension-ben.
A Ray Wenderlich (2025) szerint ezen korlátozások megértése segít elkerülni a hibákat a korai szakaszokban, és előrejelzhetőbbé teszi a Swift kódot.
Gyakran Ismételt Kérdések
Igen, minden megfigyelő opcionális. Deklarálhat csak willSet-et, csak didSet-et vagy mindkettőt egyszerre.
Nem, a Swift tiltja a willSet és didSet hozzáadását extension-ben stored properties esetén. A megfigyelők csak a típus eredeti definíciójában deklarálhatók.
Nem, inicializáláskor a megfigyelők nem hívódnak meg. Ez egy védelmi mechanizmus, amely megakadályozza a mellékhatásokat az objektum konstrukciós szakaszában.
willSet egy stored property megfigyelője, amely az érték megváltozása előtt hajtódik végre. A computed property setter egy új érték kiszámításának módja, nem a meglévő megfigyelése.
A didSet ismételt meghívása rekurziót okoz. Kilépési feltétel nélkül ez verem túlcsorduláshoz és a program vészleállításához vezet.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is