willSet и didSet у Swift-у: шта је то, синтакса и рад посматрача

Аутор: IT Sectr Објављено: 2026-06-20 Време читања: 9 мин

willSet и didSet су посматрачи својстава (property observers) у Swift-у који омогућавају извршавање кода пре и после промене вредности својства. За разлику од computed properties, посматрачи не израчунавају нову вредност, већ само реагују на промену. Према Apple документацији, The Swift Programming Language (2026), посматрачи су незаменљиви при валидацији података, синхронизацији интерфејса и евидентирању промена у коду.

Главно

  • willSet — позива се пре чувања нове вредности својства
  • didSet — позива се после чувања нове вредности
  • newValue — имплицитни параметар у willSet-у, садржи нову вредност
  • oldValue — имплицитни параметар у didSet-у, садржи стару вредност
  • Посматрачи — не раде при иницијализацији и унутар init-а

Шта су willSet и didSet у Swift-у?

willSet и didSet су property observers (посматрачи својстава) у Swift-у, уграђени механизам за праћење промена stored properties.

За разлику од других језика где је потребна ручна имплементација сетера или callback система, Swift пружа декларативну синтаксу за реакцију на промене. Посматрачи се додају непосредно после декларације својства и не захтевају засебан позив.

Према Apple Developer Documentation (2026), property observers су подржани за stored properties било које класе, структуре или набрајања. Они не раде са computed properties, јер one не чувају вредност — за њих се реакција на промену имплементира директно у сетеру.

Када се позива willSet

willSet се позива непосредно пре доделе нове вредности својству. Унутар willSet-а доступан је имплицитни параметар newValue, који садржи вредност која ће бити постављена. У овом тренутку тренутна вредност својства се још није променила — можете прочитати стару вредност директно преко својства.

Према Swift Evolution proposal SE-0001 (2024), willSet пружа могућност да се изврши валидација или евидентирање пре стварне промене. Ако се у willSet-у баци изузетак — нова вредност се неће применити, што чини посматраче механизмом заштите података.

Када се позива didSet

didSet се позива непосредно после доделе нове вредности. Унутар didSet-а доступан је имплицитни параметар oldValue, који садржи вредност пре промене. У овом тренутку својство већ садржи нову вредност и можете је упоредити са старом.

Према Swift by Sundell (2025), didSet је најпопуларнији посматрач, јер је најчешће потребан за пост-обраду: ажурирање UI-ја, прерачунавање зависних поља или слање података на сервер после промене.

Синтакса посматрача својстава

Property observers се декларишу непосредно после својства коришћењем витичастих заграда. Минимална синтакса захтева само једног посматрача, али се могу декларисати оба.

swift
var score: Int = 0 {
    willSet {
        print("Резултат ће се променити у \(newValue)")
    }
    didSet {
        print("Резултат се променио са \(oldValue) на \(score)")
    }
}

Оба посматрача су опционална — можете навести само willSet или само didSet. За willSet се може преименовати newValue навођењем имена у заградама.

swift
var username: String = "guest" {
    willSet(newName) {
        print("Управо ћу поставити \(newName)")
    }
    didSet(oldName) {
        print("Било је \(oldName), сада \(username)")
    }
}

Према Swift Language Guide (2026), преименовање параметара побољшава читљивост кода, посебно када се својство и посматрачи користе у великом пројекту са дугим именима.

Како раде willSet и didSet

Редослед извршавања је строго дефинисан: прво willSet (стара вредност је доступна), затим додела, потом didSet (нова вредност је доступна).

swift
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 не блокира рекурзију — програмер мора да је контролише сам.

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

Такав код ће створити тоталну рекурзију са прекорачењем стека, ако није предвиђен услов изласка. Према Stack Overflow Swift Community (2025), ово је једна од најчешћих грешака почетника при раду са property observers.

Посматрачи за својства структура

Структуре подржавају willSet и didSet за stored properties без ограничења. Важно је запамтити да су структуре value types, а модификација својства унутар мутирајућег метода такође покреће посматраче.

swift
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-у и обезбеђује интегритет података на нивоу модела.

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

UI синхронизација

При промени повезаног својства можете аутоматски ажурирати елементе интерфејса без засебног позива метода за ажурирање.

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

Евидентирање промена

willSet је погодан за евидентирање у циљу отклањања грешака или ревизије. Можете забележити време и нову вредност пре њене примене, гарантујући да евиденција садржи оригиналне податке за анализу.

Према objc.io (2025), property observers су посебно корисни у архитектурама са једносмерним током података, где се свака промена својства бележи за каснију репродукцију стања.

Поређење са computed properties

Computed properties израчунавају вредност у лету и немају складиште, док willSet и didSet раде на stored property са стварном вредношћу.

КарактеристикаProperty ObserversComputed Properties
Чува вредностДаНе
Извршава код при промениДаНе
Тип декларацијеvarvar (get/set)
Параметри приступаnewValue, oldValuenewValue (у 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-а?

Да, сваки посматрач је опционалан. Можете декларисати само willSet, само didSet или оба одједном.

Да ли посматрачи раде у extension-у?

Не, Swift забрањује додавање willSet и didSet у extension за stored properties. Посматрачи се декларишу само у оригиналној дефиницији типа.

Да ли се посматрачи позивају при промени својства унутар init-а?

Не, при иницијализацији посматрачи се не позивају. Ово је заштитни механизам који спречава споредне ефекте у фази конструисања објекта.

По чему се willSet разликује од сетера у computed property?

willSet је посматрач stored property-ја који се извршава пре промене вредности. Сетер у computed property-ју је начин израчунавања нове вредности, а не посматрање постојеће.

Шта ће се десити при промени својства унутар didSet-а?

Поновни позив didSet-а ће изазвати рекурзију. Без услова изласка то ће довести до прекорачења стека и хитног заустављања програма.

Резиме

  • willSet — посматрач који се извршава пре промене својства, са приступом newValue-ју
  • didSet — посматрач који се извршава после промене својства, са приступом oldValue-ју
  • Синтакса — observers се декларишу у витичастим заградама после декларације својства
  • Иницијализација — observers не раде унутар init-а и при постављању подразумеване вредности
  • Примена — валидација, UI синхронизација, евидентирање, ревизија промена
  • Рекурзија — промена својства унутар didSet-а захтева експлицитан услов изласка
  • Computed — не мешати са computed properties: observers посматрају, computed израчунавају

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође