willSet a didSet jsou pozorovatelé vlastností (property observers) ve Swift, kteří umožňují provádět kód před a po změně hodnoty vlastnosti. Na rozdíl od computed properties pozorovatelé novou hodnotu nevypočítávají, pouze reagují na změnu. Podle dokumentace Apple, The Swift Programming Language (2026), jsou pozorovatelé nepostradatelní při validaci dat, synchronizaci rozhraní a logování změn v kódu.
Hlavní body
willSet a didSet jsou property observers (pozorovatelé vlastností) ve Swift, vestavěný mechanismus sledování změn stored properties.
Na rozdíl od jiných jazyků, kde je vyžadována ruční implementace setterů nebo callback systémů, Swift poskytuje deklarativní syntaxi pro reakci na změny. Pozorovatelé se přidávají přímo po deklaraci vlastnosti a nevyžadují samostatné volání.
Podle Apple Developer Documentation (2026) jsou property observers podporovány pro stored properties libovolné třídy, struktury nebo výčtu. Nepracují s computed properties, protože ty hodnotu neukládají — pro ně je reakce na změnu implementována přímo v setteru.
willSet je volán těsně před přiřazením nové hodnoty vlastnosti. Uvnitř willSet je dostupný implicitní parametr newValue, který obsahuje hodnotu, která bude nastavena. V tomto okamžiku se aktuální hodnota vlastnosti ještě nezměnila — starou hodnotu můžete číst přímo přes vlastnost.
Podle Swift Evolution proposal SE-0001 (2024) willSet poskytuje možnost provést validaci nebo logování před skutečnou změnou. Pokud je ve willSet vyvolána výjimka — nová hodnota se neuplatní, což činí pozorovatele mechanismem ochrany dat.
didSet je volán těsně po přiřazení nové hodnoty. Uvnitř didSet je dostupný implicitní parametr oldValue, který obsahuje hodnotu před změnou. V tomto okamžiku vlastnost již obsahuje novou hodnotu a můžete ji porovnat se starou.
Podle Swift by Sundell (2025) je didSet nejoblíbenějším pozorovatelem, protože je nejčastěji potřebný pro zpracování po změně: aktualizaci UI, přepočet závislých polí nebo odesílání dat na server po změně.
Property observers se deklarují bezprostředně po vlastnosti pomocí složených závorek. Minimální syntaxe vyžaduje pouze jednoho pozorovatele, ale lze deklarovat oba.
var score: Int = 0 {
willSet {
print("Skóre se změní na \(newValue)")
}
didSet {
print("Skóre se změnilo z \(oldValue) na \(score)")
}
}
Oba pozorovatelé jsou volitelní — lze uvést pouze willSet nebo pouze didSet. Pro willSet lze newValue přejmenovat uvedením názvu v závorkách.
var username: String = "guest" {
willSet(newName) {
print("Chystám se nastavit \(newName)")
}
didSet(oldName) {
print("Bylo \(oldName), nyní \(username)")
}
}
Podle Swift Language Guide (2026) přejmenování parametrů zlepšuje čitelnost kódu, zejména pokud je vlastnost a pozorovatelé používáni ve velkém projektu s dlouhými názvy.
Pořadí provádění je striktně dané: nejprve willSet (stará hodnota je dostupná), poté přiřazení, pak didSet (nová hodnota je dostupná).
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("Teplota se změní z \(celsius) na \(newValue)")
}
didSet {
if celsius > 100.0 {
print("Bod varu překročen!")
}
}
}
}
Důležité omezení: pozorovatelé nejsou voláni při inicializaci vlastnosti v procesu vytváření instance. Uvnitř init přiřazení hodnoty nespouští willSet a didSet — to zabraňuje nežádoucím vedlejším účinkům ve fázi konstrukce.
Podle Apple Swift Blog (2025) se toto chování liší od mnoha jiných jazyků, kde jsou settery volány i v konstruktorech. Swift volí bezpečnost: pozorovatelé začnou fungovat až po dokončení inicializace objektu.
Změna vlastnosti uvnitř didSet může vést k opakovanému volání pozorovatelů. Swift rekurzi neblokuje — programátor ji musí řídit sám.
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
Takový kód vytvoří totální rekurzi s přetečením zásobníku, pokud není zajištěna podmínka pro ukončení. Podle Stack Overflow Swift Community (2025) je to jedna z nejčastějších chyb začínajících programátorů při práci s property observers.
Struktury podporují willSet a didSet pro stored properties bez omezení. Je důležité si pamatovat, že struktury jsou value types a modifikace vlastnosti uvnitř mutující metody také spouští pozorovatele.
struct Point {
var x: Double = 0.0 {
didSet {
print("X se změnilo na \(x)")
}
}
var y: Double = 0.0 {
didSet {
print("Y se změnilo na \(y)")
}
}
}
var point = Point()
point.x = 5.0
Pozorovatelé vlastností se používají v projektech Swift pro široké spektrum úloh: od synchronizace UI po validaci dat a logování.
didSet umožňuje vrátit nebo opravit neplatnou hodnotu ihned po jejím nastavení. To nahrazuje rozsáhlé settery v Objective-C a zajišťuje integritu dat na úrovni modelu.
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
Při změně související vlastnosti lze automaticky aktualizovat prvky rozhraní bez samostatného volání metody aktualizace.
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet je vhodný pro logování za účelem ladění nebo auditu. Můžete zaznamenat čas a novou hodnotu před jejím uplatněním, čímž zajistíte, že log obsahuje původní data pro analýzu.
Podle objc.io (2025) jsou property observers zvláště užitečné v architekturách s jednosměrným tokem dat, kde je každá změna vlastnosti zaznamenána pro pozdější reprodukci stavu.
Computed properties vypočítávají hodnotu na místě a nemají úložiště, zatímco willSet a didSet pracují na stored property se skutečnou hodnotou.
| Charakteristika | Property Observers | Computed Properties |
|---|---|---|
| Ukládá hodnotu | Ano | Ne |
| Provádí kód při změně | Ano | Ne |
| Typ deklarace | var | var (get/set) |
| Parametry přístupu | newValue, oldValue | newValue (v set) |
| Inicializace | Vyžaduje počáteční hodnotu | Nevyžaduje |
Klíčový rozdíl: computed property vypočítává hodnotu při každém přístupu, zatímco property observer reaguje na změnu existující hodnoty. Volba mezi nimi je diktována sémantikou — pokud je vlastnost odvozena z jiných dat, použijte computed; pokud se jedná o samostatnou hodnotu, jejíž změny je třeba sledovat, použijte willSet/didSet.
Nejčastější chyba — rekurzivní volání didSet bez podmínky ukončení. Každá změna vlastnosti uvnitř didSet znovu spouští observer, což vede k nekonečné smyčce.
Druhou častou chybou — pokus o použití pozorovatelů na let vlastnostech. Kompilátor Swift vrátí chybu, protože let je konstanta.
Třetí chyba — ignorování skutečnosti, že observer není volán při inicializaci. Vývojáři, kteří očekávají spuštění willSet uvnitř init, se setkávají s neočekávaným chováním.
Čtvrtým problémem — aplikace pozorovatelů na vlastnosti v extension. Swift zakazuje přidávat willSet/didSet k stored properties v extension.
Podle Ray Wenderlich (2025) pomáhá pochopení těchto omezení vyhnout se chybám v raných fázích a činí kód ve Swift předvídatelnějším.
Často kladené otázky
Ano, každý pozorovatel je volitelný. Můžete deklarovat pouze willSet, pouze didSet nebo oba najednou.
Ne, Swift zakazuje přidávání willSet a didSet v extension pro stored properties. Pozorovatelé se deklarují pouze v původní definici typu.
Ne, při inicializaci pozorovatelé voláni nejsou. Jedná se o ochranný mechanismus zabraňující vedlejším účinkům ve fázi konstrukce objektu.
willSet je pozorovatel stored property prováděný před změnou hodnoty. Setter v computed property je způsob výpočtu nové hodnoty, nikoli pozorování existující.
Opakované volání didSet vyvolá rekurzi. Bez podmínky ukončení to povede k přetečení zásobníku a nouzovému ukončení programu.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také