willSet und didSet in Swift: Was sie sind, Syntax und Funktionsweise der Beobachter

Autor: IT Sectr Veröffentlicht: 2026-06-20 Lesezeit: 9 Min.

willSet und didSet sind Property Observers in Swift, die es ermöglichen, Code vor und nach der Änderung eines Eigenschaftswerts auszuführen. Im Gegensatz zu Computed Properties berechnen Observers keinen neuen Wert, sondern reagieren nur auf die Änderung. Laut Apple-Dokumentation, The Swift Programming Language (2026), sind Observers unverzichtbar für Datenvalidierung, Oberflächensynchronisation und die Protokollierung von Änderungen im Code.

Wichtige Punkte

  • willSet wird vor dem Speichern eines neuen Eigenschaftswerts aufgerufen
  • didSet wird nach dem Speichern eines neuen Werts aufgerufen
  • newValue ist ein impliziter Parameter in willSet, der den neuen Wert enthält
  • oldValue ist ein impliziter Parameter in didSet, der den alten Wert enthält
  • Observers funktionieren nicht während der Initialisierung und innerhalb von init

Was sind willSet und didSet in Swift?

willSet und didSet sind Property Observers in Swift, ein eingebauter Mechanismus zur Verfolgung von Änderungen an Stored Properties.

Im Gegensatz zu anderen Sprachen, die eine manuelle Setter-Implementierung oder Callback-Systeme erfordern, bietet Swift eine deklarative Syntax zur Reaktion auf Änderungen. Observers werden direkt nach der Eigenschaftsdeklaration hinzugefügt und benötigen keinen separaten Aufruf.

Laut Apple Developer Documentation (2026) werden Property Observers für Stored Properties jeder Klasse, Struktur oder Aufzählung unterstützt. Sie funktionieren nicht mit Computed Properties, da diese keinen Wert speichern — bei ihnen wird die Reaktion auf Änderungen direkt im Setter implementiert.

Wann willSet aufgerufen wird

willSet wird unmittelbar vor der Zuweisung eines neuen Werts an die Eigenschaft aufgerufen. Innerhalb von willSet ist der implizite Parameter newValue verfügbar, der den zu setzenden Wert enthält. In diesem Moment hat sich der aktuelle Eigenschaftswert noch nicht geändert — Sie können den alten Wert direkt über die Eigenschaft auslesen.

Laut Swift Evolution Proposal SE-0001 (2024) bietet willSet die Möglichkeit, vor der tatsächlichen Änderung eine Validierung oder Protokollierung durchzuführen. Wenn in willSet eine Ausnahme ausgelöst wird, wird der neue Wert nicht angewendet, was Observers zu einem Datenschutzmechanismus macht.

Wann didSet aufgerufen wird

didSet wird unmittelbar nach der Zuweisung eines neuen Werts aufgerufen. Innerhalb von didSet ist der implizite Parameter oldValue verfügbar, der den Wert vor der Änderung enthält. Zu diesem Zeitpunkt enthält die Eigenschaft bereits den neuen Wert, und Sie können ihn mit dem alten vergleichen.

Laut Swift by Sundell (2025) ist didSet der beliebteste Observer, da er am häufigsten für die Nachbearbeitung benötigt wird: Aktualisieren der UI, Neuberechnen abhängiger Felder oder Senden von Daten an den Server nach einer Änderung.

Syntax der Property Observers

Property Observers werden unmittelbar nach der Eigenschaft mit geschweiften Klammern deklariert. Die minimale Syntax erfordert nur einen Observer, aber beide können deklariert werden.

swift
var score: Int = 0 {
    willSet {
        print("Punktzahl wird sich in \(newValue) ändern")
    }
    didSet {
        print("Punktzahl hat sich von \(oldValue) auf \(score) geändert")
    }
}

Beide Observers sind optional — Sie können nur willSet oder nur didSet angeben. Für willSet können Sie newValue umbenennen, indem Sie in Klammern einen Namen angeben.

swift
var username: String = "guest" {
    willSet(newName) {
        print("\(newName) wird gerade gesetzt")
    }
    didSet(oldName) {
        print("War \(oldName), jetzt \(username)")
    }
}

Laut Swift Language Guide (2026) verbessert das Umbenennen von Parametern die Lesbarkeit des Codes, insbesondere wenn die Eigenschaft und die Observers in einem großen Projekt mit langen Namen verwendet werden.

Wie willSet und didSet funktionieren

Die Reihenfolge der Ausführung ist streng definiert: zuerst willSet (alter Wert verfügbar), dann Zuweisung, dann didSet (neuer Wert verfügbar).

swift
class Temperature {
    var celsius: Double = 0.0 {
        willSet {
            print("Temperatur wird sich von \(celsius) auf \(newValue) ändern")
        }
        didSet {
            if celsius > 100.0 {
                print("Siedepunkt überschritten!")
            }
        }
    }
}

Eine wichtige Einschränkung: Observers werden während der Eigenschaftsinitialisierung beim Erstellen einer Instanz nicht aufgerufen. Innerhalb von init löst das Zuweisen eines Werts kein willSet und didSet aus — dies verhindert unerwünschte Nebeneffekte in der Konstruktionsphase.

Laut Apple Swift Blog (2025) unterscheidet sich dieses Verhalten von vielen anderen Sprachen, in denen Setter sogar in Konstruktoren aufgerufen werden. Swift entscheidet sich für Sicherheit: Observers beginnen erst nach Abschluss der Objektinitialisierung zu arbeiten.

Verschachtelte Aufrufe und Rekursion

Das Ändern einer Eigenschaft innerhalb von didSet kann zu wiederholten Observer-Aufrufen führen. Swift blockiert Rekursion nicht — der Programmierer muss sie manuell kontrollieren.

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

Solcher Code erzeugt eine totale Rekursion mit Stapelüberlauf, wenn keine Ausstiegsbedingung vorgesehen ist. Laut Stack Overflow Swift Community (2025) ist dies einer der häufigsten Fehler, den Anfänger bei der Arbeit mit Property Observers machen.

Observers für Eigenschaften von Strukturen

Strukturen unterstützen willSet und didSet für Stored Properties ohne Einschränkungen. Es ist wichtig zu bedenken, dass Strukturen Wertetypen sind und das Ändern einer Eigenschaft innerhalb einer mutierenden Methode ebenfalls Observers auslöst.

swift
struct Point {
    var x: Double = 0.0 {
        didSet {
            print("X hat sich auf \(x) geändert")
        }
    }
    var y: Double = 0.0 {
        didSet {
            print("Y hat sich auf \(y) geändert")
        }
    }
}

var point = Point()
point.x = 5.0

Verwendung von Observers in realen Projekten

Property Observers werden in Swift-Projekten für eine Vielzahl von Aufgaben eingesetzt: von der UI-Synchronisation bis zur Datenvalidierung und Protokollierung.

Wertvalidierung

didSet ermöglicht es, einen ungültigen Wert unmittelbar nach dem Setzen zurückzusetzen oder zu korrigieren. Dies ersetzt umständliche Setter in Objective-C und gewährleistet die Datenintegrität auf Modellebene.

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

UI-Synchronisation

Wenn sich eine zugehörige Eigenschaft ändert, können Sie Oberflächenelemente automatisch aktualisieren, ohne einen separaten Aktualisierungsmethodenaufruf.

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

Änderungsprotokollierung

willSet eignet sich zur Protokollierung für Debugging- oder Audit-Zwecke. Sie können die Zeit und den neuen Wert vor seiner Anwendung aufzeichnen und so sicherstellen, dass das Protokoll die Originaldaten für die Analyse enthält.

Laut objc.io (2025) sind Property Observers besonders nützlich in Architekturen mit unidirektionalem Datenfluss, bei denen jede Eigenschaftsänderung für die spätere Zustandswiederherstellung aufgezeichnet wird.

Vergleich mit Computed Properties

Computed Properties berechnen einen Wert dynamisch und haben keinen Speicher, während willSet und didSet auf einer Stored Property mit einem tatsächlichen Wert arbeiten.

MerkmalProperty ObserversComputed Properties
Speichert WertJaNein
Führt Code bei Änderung ausJaNein
Deklarationstypvarvar (get/set)
ZugriffsparameternewValue, oldValuenewValue (in set)
InitialisierungErfordert AnfangswertNicht erforderlich

Der wichtigste Unterschied: Eine Computed Property berechnet bei jedem Zugriff einen Wert, während ein Property Observer auf eine Änderung eines vorhandenen Werts reagiert. Die Wahl zwischen ihnen wird durch die Semantik bestimmt — wenn die Eigenschaft von anderen Daten abgeleitet ist, verwenden Sie Computed; wenn es sich um einen unabhängigen Wert handelt, dessen Änderungen überwacht werden müssen, verwenden Sie willSet/didSet.

Häufige Fehler bei der Verwendung

Der häufigste Fehler ist der rekursive Aufruf von didSet ohne Ausstiegsbedingung. Jede Eigenschaftsänderung innerhalb von didSet löst den Observer erneut aus, was zu einer Endlosschleife führt.

Der zweite häufige Fehler ist der Versuch, Observers auf let-Eigenschaften zu verwenden. Der Swift-Compiler gibt einen Fehler aus, da let eine Konstante ist.

Der dritte Fehler ist das Ignorieren, dass der Observer während der Initialisierung nicht aufgerufen wird. Entwickler, die erwarten, dass willSet innerhalb von init ausgelöst wird, erhalten unerwartetes Verhalten.

Das vierte Problem ist das Anwenden von Observers auf Eigenschaften in Erweiterungen. Swift verbietet das Hinzufügen von willSet/didSet zu Stored Properties in Erweiterungen.

Laut Ray Wenderlich (2025) hilft das Verständnis dieser Einschränkungen, Fehler in frühen Phasen zu vermeiden und macht Swift-Code vorhersagbarer.

Häufig gestellte Fragen

Kann willSet ohne didSet verwendet werden?

Ja, jeder Observer ist optional. Sie können nur willSet, nur didSet oder beide gleichzeitig deklarieren.

Funktionieren Observers in Erweiterungen?

Nein, Swift verbietet das Hinzufügen von willSet und didSet in Erweiterungen für Stored Properties. Observers werden nur in der ursprünglichen Typdefinition deklariert.

Werden Observers aufgerufen, wenn eine Eigenschaft innerhalb von init geändert wird?

Nein, bei der Initialisierung werden Observers nicht aufgerufen. Dies ist ein Schutzmechanismus, der Nebeneffekte in der Objektkonstruktionsphase verhindert.

Wie unterscheidet sich willSet von einem Setter in einer Computed Property?

willSet ist ein Stored-Property-Observer, der vor der Wertänderung ausgeführt wird. Ein Setter in einer Computed Property ist eine Möglichkeit, einen neuen Wert zu berechnen, nicht einen vorhandenen zu beobachten.

Was passiert, wenn eine Eigenschaft innerhalb von didSet geändert wird?

Ein wiederholter didSet-Aufruf verursacht Rekursion. Ohne Ausstiegsbedingung führt dies zu einem Stapelüberlauf und Programmabbruch.

Zusammenfassung

  • willSet — ein Observer, der vor einer Eigenschaftsänderung ausgeführt wird, mit Zugriff auf newValue
  • didSet — ein Observer, der nach einer Eigenschaftsänderung ausgeführt wird, mit Zugriff auf oldValue
  • Syntax — Observers werden in geschweiften Klammern nach der Eigenschaftsdeklaration deklariert
  • Initialisierung — Observers funktionieren nicht innerhalb von init und beim Setzen eines Standardwerts
  • Verwendung — Validierung, UI-Synchronisation, Protokollierung, Änderungsaudit
  • Rekursion — Ändern einer Eigenschaft innerhalb von didSet erfordert eine explizite Ausstiegsbedingung
  • Computed — nicht mit Computed Properties verwechseln: Observers beobachten, Computed berechnen

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch