Bird
Raised Fist0
Swiftprogramming~10 mins

Property observers (willSet, didSet) in Swift - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Property observers (willSet, didSet)
Property value about to change
↓
willSet called
↓
Property value changes
↓
didSet called
↓
Continue execution
When a property value changes, willSet runs before the change, and didSet runs after the change.
Execution Sample
Swift
var score: Int = 0 {
    willSet {
        print("About to set score to \(newValue)")
    }
    didSet {
        print("Score changed from \(oldValue) to \(score)")
    }
}
score = 10
This code shows how willSet and didSet run when the 'score' property changes from 0 to 10.
Execution Table
StepProperty 'score' ValueEventwillSet newValuedidSet oldValueOutput
10Initial state---
20 -> 10Assign score = 1010-About to set score to 10
310After assignment-0Score changed from 0 to 10
💡 Property 'score' changed from 0 to 10, observers finished.
Variable Tracker
VariableStartAfter willSetAfter didSetFinal
score00 (before change)10 (after change)10
Key Moments - 2 Insights
Why does willSet see the new value but didSet sees the old value?
willSet runs before the property changes, so it receives the newValue about to be set (see execution_table step 2). didSet runs after the change, so it sees the oldValue before the change (see execution_table step 3).
Can willSet or didSet change the property value inside their blocks?
No, changing the property inside willSet or didSet can cause unexpected behavior or infinite loops. They are meant only to observe changes, not modify them.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of 'score' during willSet?
A0 (old value)
B10 (new value)
CUndefined
DIt depends
💡 Hint
Check the 'Property 'score' Value' and 'willSet newValue' columns at step 2.
At which step does didSet run?
AStep 3
BStep 2
CStep 1
DAfter step 3
💡 Hint
Look at the 'Event' and 'Output' columns in the execution_table.
If we assign score = 20 next, what will willSet print?
A"Score changed from 10 to 20"
B"About to set score to 10"
C"About to set score to 20"
DNothing
💡 Hint
willSet prints the new value about to be assigned (see execution_table step 2).
Concept Snapshot
Property observers let you watch changes to a property.
willSet runs just before the value changes, receiving newValue.
didSet runs just after the value changes, receiving oldValue.
Use them to react to changes without changing the value inside.
Syntax: var prop: Type { willSet { } didSet { } }
Full Transcript
Property observers in Swift let you run code before and after a property changes. The willSet observer runs right before the property value changes and receives the new value that will be set. The didSet observer runs right after the property changes and receives the old value before the change. In the example, when 'score' changes from 0 to 10, willSet prints the new value 10 before the change, and didSet prints the old value 0 after the change. This helps you track or respond to changes safely. You should not change the property inside these observers to avoid unexpected behavior.

Practice

(1/5)
1. What does the willSet property observer do in Swift?
easy
A. It runs code after the property value changes.
B. It runs code just before the property value changes.
C. It prevents the property value from changing.
D. It initializes the property with a default value.

Solution

  1. Step 1: Understand the role of willSet

    willSet runs code right before the property value changes.
  2. Step 2: Compare with didSet

    didSet runs code after the value changes, so it is different from willSet.
  3. Final Answer:

    It runs code just before the property value changes. -> Option B
  4. Quick Check:

    willSet = before change [OK]
Hint: willSet runs before change, didSet runs after [OK]
Common Mistakes:
  • Confusing willSet with didSet
  • Thinking willSet stops the change
  • Assuming willSet initializes the property
2. Which of the following is the correct syntax to add a didSet observer to a Swift property score?
easy
A. var score: Int { didSet { print("Score changed") } }
B. var score: Int = 0 didSet { print("Score changed") }
C. var score: Int = 0 { didSet { print("Score changed") } }
D. var score: Int didSet { print("Score changed") }

Solution

  1. Step 1: Recall property observer syntax

    Property observers must be inside braces after property declaration with initial value.
  2. Step 2: Check each option

    var score: Int = 0 { didSet { print("Score changed") } } correctly declares score with initial value and braces containing didSet.
  3. Final Answer:

    var score: Int = 0 { didSet { print("Score changed") } } -> Option C
  4. Quick Check:

    Correct syntax uses braces after initial value [OK]
Hint: Use braces after initial value for observers [OK]
Common Mistakes:
  • Missing braces around didSet block
  • No initial value for stored property
  • Placing didSet outside property declaration
3. What will be printed when the following Swift code runs?
class Counter {
    var count: Int = 0 {
        willSet {
            print("About to set count to \(newValue)")
        }
        didSet {
            print("Count changed from \(oldValue) to \(count)")
        }
    }
}

let counter = Counter()
counter.count = 5
medium
A. About to set count to 5 Count changed from 0 to 5
B. Count changed from 0 to 5 About to set count to 5
C. About to set count to 0 Count changed from 0 to 5
D. Count changed from 5 to 0 About to set count to 5

Solution

  1. Step 1: Understand willSet and didSet order

    willSet runs before the value changes, printing the new value. didSet runs after, printing old and new values.
  2. Step 2: Trace the code execution

    Setting count to 5 triggers willSet printing "About to set count to 5", then didSet printing "Count changed from 0 to 5".
  3. Final Answer:

    About to set count to 5 Count changed from 0 to 5 -> Option A
  4. Quick Check:

    willSet before, didSet after change [OK]
Hint: willSet prints newValue, didSet prints oldValue and new value [OK]
Common Mistakes:
  • Mixing order of willSet and didSet prints
  • Confusing oldValue and newValue
  • Ignoring that willSet runs before assignment
4. Identify the error in this Swift code using property observers:
struct Temperature {
    var celsius: Double {
        willSet(newTemp) {
            print("Temperature will change to \(newTemp)")
        }
        didSet {
            print("Temperature changed from \(oldValue) to \(celsius)")
        }
    }
}

var temp = Temperature(celsius: 25)
temp.celsius = 30
medium
A. Property observers cannot be used in structs.
B. The willSet parameter name cannot be custom like newTemp.
C. The struct cannot be instantiated with an initial value.
D. Stored property must have an initial value or be optional.

Solution

  1. Step 1: Check property declaration rules

    Stored properties in structs must have initial values or be optional unless initialized in init.
  2. Step 2: Analyze the code

    Property celsius has no initial value and no initializer, causing error.
  3. Final Answer:

    Stored property must have an initial value or be optional. -> Option D
  4. Quick Check:

    Stored properties need initial values [OK]
Hint: Stored properties need initial values or init [OK]
Common Mistakes:
  • Thinking willSet parameter name is invalid
  • Assuming property observers disallowed in structs
  • Ignoring missing initial value error
5. You want to track changes to a user's age property and prevent it from being set to a value less than the current age. Which approach using property observers is correct?
hard
A. Use didSet to check if age decreased and reset it back to oldValue.
B. Use willSet to check newValue and revert if less than current age.
C. Use willSet to prevent assignment by throwing an error.
D. Use didSet to print a message but allow any change.

Solution

  1. Step 1: Understand property observer capabilities

    Property observers cannot prevent assignment in willSet; they run before or after change but cannot stop it.
  2. Step 2: Choose correct way to revert invalid change

    In didSet, you can detect invalid changes and reset the property back to oldValue to prevent decrease.
  3. Final Answer:

    Use didSet to check if age decreased and reset it back to oldValue. -> Option A
  4. Quick Check:

    didSet can revert changes, willSet cannot prevent them [OK]
Hint: Use didSet to revert invalid changes, willSet can't stop assignment [OK]
Common Mistakes:
  • Trying to prevent assignment in willSet
  • Assuming willSet can throw errors
  • Not resetting property in didSet after invalid change
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard