Swift语言属性监视器Swift语言入门很简单大学霸
Swift语言属性监视器Swift语言入门很简单大学霸
8.2.4 属性监视器Swift语言属性监视器Swift语言入门很简单大学霸属性监视器用来监控和响应属性值的变化。每次属性被设置值的时候,都会调用属性监视器,哪怕是新的值和原先的值相同。一个属性监视器由willSet和didSet组成,其定义形式如下:
var 属性名:数据类型=初始值{
willSet(参数名){
…
}
didSet(参数名){
…
}
}
其中,willSet在设置新的值之前被调用,它会将新的属性值作为固定参数传入。didSet在新的值被设置之后被调用,会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名oldValueSwift语言属性监视器Swift语言入门很简单大学霸。
【示例8-12】以下将使用属性监视器监视totalSteps属性值的变化。代码如下Swift语言属性监视器Swift语言入门很简单大学霸:
import Foundation
class StepCounter {
var totalSteps: Int = 0 {
//完整的属性监视器
willSet(newTotalSteps) {
println(“新的值为 \(newTotalSteps)”)
}
didSet(old) {
if totalSteps > old {
println(“与原来相比增减了 \(totalSteps – old) 个值”)
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 0
stepCounter.totalSteps = 200
stepCounter.totalSteps = 400
stepCounter.totalSteps = 800
运行结果如下所示:
新的值为 0
新的值为 200
与原来相比增减了 200 个值
新的值为 400
与原来相比增减了 200 个值
新的值为 800
与原来相比增减了 400 个值
Program ended with exit code: 0
注意:在使用属性监视器时,需要使用注意以下4点:
1.不指定参数名
在willSet后面是可以不指定参数的,这时Swift会使用默认newValue表示新值。例如以下的代码在没有指定willSet参数的情况下,直接使用newValue来输出新的值。代码如下:
import Foundation
class StepCounter {
var totalSteps: Int=0 {
willSet {
println(“新的值为 \(newValue)”)
}
didSet (old){
if totalSteps > old {
println(“与原来相比增减了 \(totalSteps – old) 个值”)
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 0
stepCounter.totalSteps = 200
运行结果如下所示:
新的值为 0
新的值为 200
与原来相比增减了 200 个值
Program ended with exit code: 0
同样在didSet后面也可以不指定参数名,此时Swift会使用默认参数名oldValue。如以下的代码,此是示例8-12的代码做了一个修改,代码如下:
import Foundation
class StepCounter {
var totalSteps: Int = 0 {
//完整的属性监视器
willSet(newTotalSteps) {
println(“新的值为 \(newTotalSteps)”)
}
didSet {
if totalSteps > oldValue { println(“与原来相比增减了 \(totalSteps – oldValue) 个值”)
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 0
…
2.默认参数不可以交换使用
在使用willSet和didSet时,它们默认的参数可以是不可以交换使用的。例如在willSet中使用的newValue不可以使用在didSet中,在didSet中使用的oldValue不可以使用在willSet中,否则程序就会出现错误。例如以下的代码,将示例8-12做了一些修改,代码如下:
import Foundation
class StepCounter {
var totalSteps: Int = 0 {
//完整的属性监视器
willSet {
println(“新的值为 \(newValue)”)
}
didSet {
if newValue > oldValue {
println(“与原来相比增减了 \(newValue – oldValue) 个值”) //输出新值和旧值之间的差值
}
}
}
}
let stepCounter = StepCounter()
…
在此代码中,由于在didSet中使用了willSet中的默认参数,导致程序出现了以下的错误:
Use of unresolved identifier ‘newValue’
3.延迟属性不能使用属性监视器
在延迟属性中不可以使用属性监视器,否则程序会出现错误。如以下的代码:
class StepCounter {
lazy var totalSteps: Int=0 {
willSet {
println(“新的值为 \(newValue)”)
}
didSet {
if totalSteps > oldValue {
println(“与原来相比增减了 \(totalSteps – oldValue) 个值”)
}
}
}
}
此代码中延迟属性中添加了属性监视器,导致程序出现了如下的错误:
lazy properties may not have observers
4.分开使用willSet和didSet
一个完整的属性监视器由willSet和didSet组成,但是willSet和didSet也可以单独使用。例如以下的代码就只使用了willSet输出了新值的信息。代码如下:
import Foundation
class StepCounter {
var totalSteps: Int=0 {
willSet {
println(“新的值为 \(newValue)”)
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 0
stepCounter.totalSteps = 200
stepCounter.totalSteps = 600
stepCounter.totalSteps = 1200
这里属性监视器total只使用了willset,而没有使用didset。运作结果如下所示:
新的值为 0
新的值为 200
新的值为 600
新的值为 1200
Program ended with exit code: 0Swift语言属性监视器Swift语言入门很简单大学霸
Comments are closed.