willSet и didSet су посматрачи својстава (property observers) у Swift-у који омогућавају извршавање кода пре и после промене вредности својства. За разлику од computed properties, посматрачи не израчунавају нову вредност, већ само реагују на промену. Према Apple документацији, The Swift Programming Language (2026), посматрачи су незаменљиви при валидацији података, синхронизацији интерфејса и евидентирању промена у коду.
Главно
willSet и didSet су property observers (посматрачи својстава) у Swift-у, уграђени механизам за праћење промена stored properties.
За разлику од других језика где је потребна ручна имплементација сетера или callback система, Swift пружа декларативну синтаксу за реакцију на промене. Посматрачи се додају непосредно после декларације својства и не захтевају засебан позив.
Према Apple Developer Documentation (2026), property observers су подржани за stored properties било које класе, структуре или набрајања. Они не раде са computed properties, јер one не чувају вредност — за њих се реакција на промену имплементира директно у сетеру.
willSet се позива непосредно пре доделе нове вредности својству. Унутар willSet-а доступан је имплицитни параметар newValue, који садржи вредност која ће бити постављена. У овом тренутку тренутна вредност својства се још није променила — можете прочитати стару вредност директно преко својства.
Према Swift Evolution proposal SE-0001 (2024), willSet пружа могућност да се изврши валидација или евидентирање пре стварне промене. Ако се у willSet-у баци изузетак — нова вредност се неће применити, што чини посматраче механизмом заштите података.
didSet се позива непосредно после доделе нове вредности. Унутар didSet-а доступан је имплицитни параметар oldValue, који садржи вредност пре промене. У овом тренутку својство већ садржи нову вредност и можете је упоредити са старом.
Према Swift by Sundell (2025), didSet је најпопуларнији посматрач, јер је најчешће потребан за пост-обраду: ажурирање UI-ја, прерачунавање зависних поља или слање података на сервер после промене.
Property observers се декларишу непосредно после својства коришћењем витичастих заграда. Минимална синтакса захтева само једног посматрача, али се могу декларисати оба.
var score: Int = 0 {
willSet {
print("Резултат ће се променити у \(newValue)")
}
didSet {
print("Резултат се променио са \(oldValue) на \(score)")
}
}
Оба посматрача су опционална — можете навести само willSet или само didSet. За willSet се може преименовати newValue навођењем имена у заградама.
var username: String = "guest" {
willSet(newName) {
print("Управо ћу поставити \(newName)")
}
didSet(oldName) {
print("Било је \(oldName), сада \(username)")
}
}
Према Swift Language Guide (2026), преименовање параметара побољшава читљивост кода, посебно када се својство и посматрачи користе у великом пројекту са дугим именима.
Редослед извршавања је строго дефинисан: прво willSet (стара вредност је доступна), затим додела, потом didSet (нова вредност је доступна).
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("Температура ће се променити са \(celsius) на \(newValue)")
}
didSet {
if celsius > 100.0 {
print("Прекорачена је тачка кључања!")
}
}
}
}
Важно ограничење: посматрачи се не позивају при иницијализацији својства у процесу креирања инстанце. Унутар init-а додела вредности не покреће willSet и didSet — ово спречава нежељене споредне ефекте у фази конструкције.
Према Apple Swift Blog (2025), ово понашање се разликује од многих других језика где се сетери позивају чак и у конструкторима. Swift бира сигурност: посматрачи почињу да раде тек по завршетку иницијализације објекта.
Промена својства унутар didSet-а може довести до поновног позивања посматрача. Swift не блокира рекурзију — програмер мора да је контролише сам.
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
Такав код ће створити тоталну рекурзију са прекорачењем стека, ако није предвиђен услов изласка. Према Stack Overflow Swift Community (2025), ово је једна од најчешћих грешака почетника при раду са property observers.
Структуре подржавају willSet и didSet за stored properties без ограничења. Важно је запамтити да су структуре value types, а модификација својства унутар мутирајућег метода такође покреће посматраче.
struct Point {
var x: Double = 0.0 {
didSet {
print("X се променило у \(x)")
}
}
var y: Double = 0.0 {
didSet {
print("Y се променило у \(y)")
}
}
}
var point = Point()
point.x = 5.0
Посматрачи својстава се користе у Swift пројектима за широк спектар задатака: од UI синхронизације до валидације података и евидентирања.
didSet омогућава повлачење или корекцију неисправне вредности одмах након њеног постављања. Ово замењује гломазне сетере у Objective-C-у и обезбеђује интегритет података на нивоу модела.
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
При промени повезаног својства можете аутоматски ажурирати елементе интерфејса без засебног позива метода за ажурирање.
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet је погодан за евидентирање у циљу отклањања грешака или ревизије. Можете забележити време и нову вредност пре њене примене, гарантујући да евиденција садржи оригиналне податке за анализу.
Према objc.io (2025), property observers су посебно корисни у архитектурама са једносмерним током података, где се свака промена својства бележи за каснију репродукцију стања.
Computed properties израчунавају вредност у лету и немају складиште, док willSet и didSet раде на stored property са стварном вредношћу.
| Карактеристика | Property Observers | Computed Properties |
|---|---|---|
| Чува вредност | Да | Не |
| Извршава код при промени | Да | Не |
| Тип декларације | var | var (get/set) |
| Параметри приступа | newValue, oldValue | newValue (у set-у) |
| Иницијализација | Захтева почетну вредност | Не захтева |
Кључна разлика: computed property израчунава вредност при сваком приступу, а property observer реагује на промену постојеће вредности. Избор између њих диктира семантика — ако је својство изведено из других података, користите computed; ако је то самостална вредност чије промене треба посматрати, користите willSet/didSet.
Најчешћа грешка — рекурзивни позив didSet-а без услова изласка. Свака промена својства унутар didSet-а поново покреће observer, што доводи до бесконачне петље.
Друга честа грешка — покушај коришћења посматрача на let својствима. Компајлер Swift-а ће пријавити грешку, јер је let константа.
Трећа грешка — игнорисање чињенице да се observer не позива при иницијализацији. Програмери који очекују покретање willSet-а унутар init-а добијају неочекивано понашање.
Четврти проблем — примена посматрача на својства у extension-у. Swift забрањује додавање willSet/didSet stored properties у extension-у.
Према Ray Wenderlich (2025), разумевање ових ограничења помаже да се избегну грешке у раним фазама и чини код на Swift-у предвидљивијим.
Често постављана питања
Да, сваки посматрач је опционалан. Можете декларисати само willSet, само didSet или оба одједном.
Не, Swift забрањује додавање willSet и didSet у extension за stored properties. Посматрачи се декларишу само у оригиналној дефиницији типа.
Не, при иницијализацији посматрачи се не позивају. Ово је заштитни механизам који спречава споредне ефекте у фази конструисања објекта.
willSet је посматрач stored property-ја који се извршава пре промене вредности. Сетер у computed property-ју је начин израчунавања нове вредности, а не посматрање постојеће.
Поновни позив didSet-а ће изазвати рекурзију. Без услова изласка то ће довести до прекорачења стека и хитног заустављања програма.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође