属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新值和当前值相同的时候也不例外。
可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重写属性的方式为继承的属性(包括存储属性和计算属性)添加属性观察器。属性重写请参考重写。
注意
不需要为非重写的计算属性添加属性观察器,因为可以通过它的 setter 直接监控和响应值的变化。
可以为属性添加如下的一个或全部观察器:
willSet在新的值被设置之前调用
didSet在新的值被设置之后立即调用
willSet观察器会将新的属性值作为常量参数传入,在willSet的实现代码中可以为这个参数指定一个名称,如果不指定则参数仍然可用,这时使用默认名称newValue表示。
类似地,didSet观察器会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名oldValue。
注意
父类的属性在子类的构造器中被赋值时,它在父类中的willSet和didSet观察器会被调用。
有关构造器代理的更多信息,请参考值类型的构造器代理和类的构造器代理规则。
这里是一个willSet和didSet的实际例子,其中定义了一个名为StepCounter的类,用来统计一个人步行时的总步数。例子如下:
class People : NSObject
{
//普通属性
var firstName:String = ""
var lastName:String = ""
var nickName:String = ""
//计算属性
var fullName:String
{
get
{
return nickName + " " + firstName + " " + lastName
}
}
//带属性监视器的普通属性
var age:Int = 0
{
//我们需要在age属性变化前做点什么
willSet
{
print("Will set an new value \(newValue) to age")
}
//我们需要在age属性发生变化后,更新一下nickName这个属性
didSet
{
print("age filed changed form \(oldValue) to \(age)")
if age<10
{
nickName = "Little"
}else
{
nickName = "Big"
}
}
}
func toString() -> String
{
return "Full Name: \(fullName) " + ", Age: \(age) "
}
}
var me = People()
me.firstName = "Zhang"
me.lastName = "San"
me.age = 20