willSet en didSet in Swift: wat is het, syntax en werking van waarnemers

Auteur: IT Sectr Gepubliceerd: 2026-06-20 Leestijd: 9 min

willSet en didSet zijn eigenschapswaarnemers (property observers) in Swift waarmee code kan worden uitgevoerd voor en na het wijzigen van een eigenschapswaarde. In tegenstelling tot computed properties berekenen waarnemers geen nieuwe waarde, maar reageren ze alleen op de wijziging. Volgens Apple-documentatie, The Swift Programming Language (2026), zijn waarnemers onmisbaar bij gegevensvalidatie, interface-synchronisatie en het loggen van wijzigingen in code.

Belangrijkste punten

  • willSet — wordt aangeroepen vóór het opslaan van de nieuwe waarde van de eigenschap
  • didSet — wordt aangeroepen na het opslaan van de nieuwe waarde
  • newValue — impliciete parameter in willSet, bevat de nieuwe waarde
  • oldValue — impliciete parameter in didSet, bevat de oude waarde
  • Waarnemers — werken niet bij initialisatie en binnen init

Wat zijn willSet en didSet in Swift?

willSet en didSet zijn property observers (eigenschapswaarnemers) in Swift, een ingebouwd mechanisme voor het volgen van wijzigingen in stored properties.

In tegenstelling tot andere talen waar handmatige implementatie van setters of callback-systemen vereist is, biedt Swift een declaratieve syntax om te reageren op wijzigingen. Waarnemers worden direct na de declaratie van de eigenschap toegevoegd en vereisen geen aparte aanroep.

Volgens Apple Developer Documentation (2026) worden property observers ondersteund voor stored properties van elke klasse, structuur of enumeratie. Ze werken niet met computed properties, omdat deze geen waarde opslaan — voor hen wordt de reactie op wijziging direct in de setter geïmplementeerd.

Wanneer wordt willSet aangeroepen

willSet wordt direct vóór het toewijzen van de nieuwe waarde aan de eigenschap aangeroepen. Binnen willSet is de impliciete parameter newValue beschikbaar, die de waarde bevat die zal worden ingesteld. Op dit moment is de huidige waarde van de eigenschap nog niet gewijzigd — u kunt de oude waarde rechtstreeks via de eigenschap lezen.

Volgens Swift Evolution proposal SE-0001 (2024) biedt willSet de mogelijkheid om validatie of logging uit te voeren vóór de daadwerkelijke wijziging. Als er in willSet een uitzondering wordt gegenereerd — wordt de nieuwe waarde niet toegepast, wat waarnemers een mechanisme voor gegevensbescherming maakt.

Wanneer wordt didSet aangeroepen

didSet wordt direct na het toewijzen van de nieuwe waarde aangeroepen. Binnen didSet is de impliciete parameter oldValue beschikbaar, die de waarde vóór de wijziging bevat. Op dit moment bevat de eigenschap al de nieuwe waarde en kunt u deze met de oude vergelijken.

Volgens Swift by Sundell (2025) is didSet de populairste waarnemer, omdat deze het vaakst nodig is voor nabewerking: UI-update, herberekening van afhankelijke velden of het verzenden van gegevens naar de server na een wijziging.

Syntax van eigenschapswaarnemers

Property observers worden direct na de eigenschap gedeclareerd met accolades. Minimale syntax vereist slechts één waarnemer, maar beide kunnen worden gedeclareerd.

swift
var score: Int = 0 {
    willSet {
        print("Score verandert naar \(newValue)")
    }
    didSet {
        print("Score veranderd van \(oldValue) naar \(score)")
    }
}

Beide waarnemers zijn optioneel — u kunt alleen willSet of alleen didSet specificeren. Voor willSet kan newValue worden hernoemd door de naam tussen haakjes op te geven.

swift
var username: String = "guest" {
    willSet(newName) {
        print("Op het punt om \(newName) in te stellen")
    }
    didSet(oldName) {
        print("Was \(oldName), nu \(username)")
    }
}

Volgens Swift Language Guide (2026) verbetert het hernoemen van parameters de leesbaarheid van code, vooral wanneer de eigenschap en waarnemers worden gebruikt in een groot project met lange namen.

Hoe willSet en didSet werken

De uitvoervolgorde is strikt bepaald: eerst willSet (oude waarde is beschikbaar), dan toewijzing, dan didSet (nieuwe waarde is beschikbaar).

swift
class Temperature {
    var celsius: Double = 0.0 {
        willSet {
            print("Temperatuur verandert van \(celsius) naar \(newValue)")
        }
        didSet {
            if celsius > 100.0 {
                print("Kookpunt overschreden!")
            }
        }
    }
}

Belangrijke beperking: waarnemers worden niet aangeroepen bij initialisatie van de eigenschap tijdens het maken van een instantie. Binnen init activeert het toewijzen van een waarde willSet en didSet niet — dit voorkomt ongewenste neveneffecten in de constructiefase.

Volgens Apple Swift Blog (2025) verschilt dit gedrag van veel andere talen waar setters zelfs in constructors worden aangeroepen. Swift kiest voor veiligheid: waarnemers beginnen pas te werken na voltooiing van de objectinitialisatie.

Geneste aanroepen en recursie

Het wijzigen van een eigenschap binnen didSet kan leiden tot herhaalde aanroep van waarnemers. Swift blokkeert recursie niet — de programmeur moet dit zelf controleren.

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

Zulke code zal totale recursie met stack-overflow creëren als er geen exit-voorwaarde is voorzien. Volgens Stack Overflow Swift Community (2025) is dit een van de meest voorkomende fouten van beginnende programmeurs bij het werken met property observers.

Waarnemers voor eigenschappen van structuren

Structuren ondersteunen willSet en didSet voor stored properties zonder beperkingen. Het is belangrijk te onthouden dat structuren value types zijn en dat het wijzigen van een eigenschap binnen een muterende methode ook waarnemers activeert.

swift
struct Point {
    var x: Double = 0.0 {
        didSet {
            print("X veranderd naar \(x)")
        }
    }
    var y: Double = 0.0 {
        didSet {
            print("Y veranderd naar \(y)")
        }
    }
}

var point = Point()
point.x = 5.0

Toepassing van waarnemers in echte projecten

Eigenschapswaarnemers worden in Swift-projecten gebruikt voor een breed scala aan taken: van UI-synchronisatie tot gegevensvalidatie en logging.

Waardevalidatie

didSet maakt het mogelijk om een ongeldige waarde direct na het instellen terug te draaien of te corrigeren. Dit vervangt omslachtige setters in Objective-C en zorgt voor gegevensintegriteit op modelniveau.

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

UI-synchronisatie

Bij wijziging van een gerelateerde eigenschap kunnen interface-elementen automatisch worden bijgewerkt zonder aparte aanroep van een updatemethode.

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

Wijzigingen loggen

willSet is handig voor logging met het oog op debugging of audit. U kunt de tijd en de nieuwe waarde vóór toepassing vastleggen, zodat het log de originele gegevens voor analyse bevat.

Volgens objc.io (2025) zijn property observers vooral nuttig in architecturen met een unidirectionele gegevensstroom, waarbij elke eigenschapswijziging wordt vastgelegd voor later herstel van de toestand.

Vergelijking met computed properties

Computed properties berekenen de waarde ter plekke en hebben geen opslag, terwijl willSet en didSet werken op een stored property met een werkelijke waarde.

KenmerkProperty ObserversComputed Properties
Slaat waarde opJaNee
Voert code uit bij wijzigingJaNee
Type declaratievarvar (get/set)
ToegangsparametersnewValue, oldValuenewValue (in set)
InitialisatieVereist beginwaardeNiet vereist

Het belangrijkste verschil: computed property berekent de waarde bij elke toegang, terwijl property observer reageert op wijziging van een bestaande waarde. De keuze ertussen wordt bepaald door semantiek — als de eigenschap is afgeleid van andere gegevens, gebruik dan computed; als het een onafhankelijke waarde is waarvan de wijzigingen moeten worden geobserveerd, gebruik dan willSet/didSet.

Veelvoorkomende fouten bij gebruik

De meest voorkomende fout — recursieve aanroep van didSet zonder exit-voorwaarde. Elke wijziging van de eigenschap binnen didSet activeert de observer opnieuw, wat leidt tot een oneindige lus.

De tweede veelvoorkomende fout — poging om waarnemers te gebruiken op let-eigenschappen. De Swift-compiler geeft een foutmelding, omdat let een constante is.

De derde fout — het negeren van het feit dat de observer niet wordt aangeroepen bij initialisatie. Ontwikkelaars die verwachten dat willSet binnen init wordt geactiveerd, krijgen onverwacht gedrag.

Het vierde probleem — het toepassen van waarnemers op eigenschappen in een extension. Swift verbiedt het toevoegen van willSet/didSet aan stored properties in een extension.

Volgens Ray Wenderlich (2025) helpt het begrijpen van deze beperkingen om bugs in vroege stadia te voorkomen en maakt het code in Swift voorspelbaarder.

Veelgestelde vragen

Kan willSet zonder didSet worden gebruikt?

Ja, elke waarnemer is optioneel. U kunt alleen willSet, alleen didSet of beide tegelijk declareren.

Werken waarnemers in een extension?

Nee, Swift verbiedt het toevoegen van willSet en didSet in een extension voor stored properties. Waarnemers worden alleen gedeclareerd in de oorspronkelijke definitie van het type.

Worden waarnemers aangeroepen bij wijziging van een eigenschap binnen init?

Nee, bij initialisatie worden waarnemers niet aangeroepen. Dit is een beschermingsmechanisme dat neveneffecten in de constructiefase van het object voorkomt.

Hoe verschilt willSet van een setter in computed property?

willSet is een waarnemer van een stored property die wordt uitgevoerd vóór de waardewijziging. Een setter in computed property is een manier om een nieuwe waarde te berekenen, niet om een bestaande te observeren.

Wat gebeurt er bij wijziging van een eigenschap binnen didSet?

Herhaalde aanroep van didSet veroorzaakt recursie. Zonder exit-voorwaarde leidt dit tot stack-overflow en het onverwacht beëindigen van het programma.

Samenvatting

  • willSet — waarnemer uitgevoerd vóór wijziging van de eigenschap, met toegang tot newValue
  • didSet — waarnemer uitgevoerd na wijziging van de eigenschap, met toegang tot oldValue
  • Syntax — observers worden gedeclareerd in accolades na de eigenschapsdeclaratie
  • Initialisatie — observers werken niet binnen init en bij het instellen van de standaardwaarde
  • Toepassing — validatie, UI-synchronisatie, logging, auditen van wijzigingen
  • Recursie — wijziging van eigenschap binnen didSet vereist een expliciete exit-voorwaarde
  • Computed — niet verwarren met computed properties: observers observeren, computed berekenen

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook