Browse Questions

Answer: The value you assign replaces the one that was just set, and the observers are not triggered again, so there is no infinite loop.

Code Example:

struct Volume {
    var level: Int = 0 {
        didSet {
            // Clamp into 0...100 — does NOT re-trigger didSet
            if level > 100 { level = 100 }
            if level < 0 { level = 0 }
        }
    }
}

var v = Volume()
v.level = 150
print(v.level) // 100

Key Points:

  • This makes didSet a common place for clamping or normalizing input.
  • In contrast, assigning to a property inside its own computed setter does recurse infinitely — a computed property has no storage, so self.x = newValue inside x's set just calls the setter again.
var name: String {
    get { name }        // ❌ infinite recursion
    set { name = newValue }
}