Swift语言属性监视器Swift语言入门很简单大学霸

Swift语言属性监视器Swift语言入门很简单大学霸

Swift语言快速入门v3.0

Swift语言快速入门v3.0

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.