Swift Programming: getter/setter in stored property

Solution 1:

Ok. Reading through Apples documentation on Swift I found this:

If you assign a value to a property within its own didSet observer, the new value that you assign will replace the one that was just set.

So all you have to do is this:

var rank: Int = 0 {
    didSet {
        // Say 1000 is not good for you and 999 is the maximum you want to be stored there
        if rank >= 1000  {
            rank = 999
        }
    }
}

Solution 2:

You can't override get/set for a stored property but you can use property observers willSet/didSet:

var totalSteps: Int = 0 {
    willSet(newTotalSteps) {
        println("About to set totalSteps to \(newTotalSteps)")
    }
    didSet {
        if totalSteps > oldValue  {
            println("Added \(totalSteps - oldValue) steps")
        }
    }
}

The default parameter names are newValue for willSet and oldValue for didSet, or you can name them yourself as in willSet(newTotalSteps).

Solution 3:

get and set are for computed properties (they don't have any backing store). (In my opinion, the keyword 'var' is confusing here)

  • willSet and didSet are called for an instance variable (Use didSet to override any changes)
  • set and get are purely for computed properties

Solution 4:

If you don't want to use didSet, which has the problem that the property's value is temporarily wrong, you should wrap a computed property around it.

private var _foo:Int = 0
var foo:Int {
    get {
        return _foo
    }
    set {
        if(newValue > 999) {
            _foo = 999
        } else {
            _foo = newValue
        }
    }
}

Or:

private var _foo:Int = 0
var foo:Int {
    get {
        return _foo
    }
    set {
        guard newValue <= 999 else {
            _foo = 999
            return
        }
        _foo = newValue
    }
}