Swift Programming: getter/setter in stored property
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)
.
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
}
}
}
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
}
}
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