We first looked at Swift's property observers back in Bite #179. They're a great way to know when a property's value is about to change, or just finished changing.
Traditionally, they look like this:
class Spaceship : NSObject {
var name: String {
didSet { print(name) }
}
}
Nothing too fancy here, just printing the latest value for name, anytime a ship's name changes.
This works great for properties on types, but it turns out we can actually use these same observers on local variables as well:
var name = "Tim Cook" {
didSet { print(name) }
}
name = "Eddy Cue"
name = "Craig Federighi"
This prints:
Eddy Cue
Craig Federighi
Neat!
Kelan Champagne mentions an interesting technique for super-simple value-change tracking:
var previousStatuses = [String]()
var awayMessage: String? = nil {
willSet {
guard let awayMessage = awayMessage else { return }
previousStatuses.append(awayMessage)
}
}
awayMessage = "out to lunch, brb"
awayMessage = "eating dinner"
awayMessage = "emo song lyrics"
awayMessage = nil
print("Previous: ", previousStatuses)
This prints:
Previous: ["out to lunch, brb", "eating dinner", "emo song lyrics"]
This technique might not make sense in many situations, but is a nice feature to know about in case we can ever benefit from it.
A huge thanks to both Kelan Champagne and Chris Eidhof for pointing this out!