《从零开始学Swift》学习笔记(Day 33)——属性观察者

时间:2022-11-14 12:56:54

原创文章,欢迎转载。转载请注明:关东升的博客

为了监听属性的变化,Swift提供了属性观察者。属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到。

属性观察者主要有以下两个:

l willSet:观察者在修改之前调用。

l didSet:观察者在修改之后立刻调用。

属性观察者的语法格式如下:

面向对象类型 类型名 {   

    ...

    var 存储属性: 属性数据类型 = 初始化值 {

    willSet(新值) {            //定义willSet观察者。“新值”是传递给willSet观察者的参数,它保存了将要替换原来属性的新值

        ...

    }                    

    didSet(旧值) {     //定义didSet观察者。“旧值”是传递给didSet观察者的参数,它保存了被新属性替换的旧值。

        ...

    }                

    }                

}

属性观察者的语法格式比计算属性要混乱。

属性观察者可以在类和结构体中使用,不能在枚举中使用。

示例代码如下:

class Employee {

    var no: Int = 

    var name: String = "Tony" {  

    willSet(newNameValue) {   //定义name属性的willSet观察者,newNameValue是由我们分配的传递新值的参数名

        print("员工name新值:\(newNameValue)")  

    }

    didSet(oldNameValue) {    //定义name属性的didSet观察者,oldNameValue是由我们分配的传递旧值的参数名

        print("员工name旧值:\(oldNameValue)")

    }

    }

    var job: String?

    var salary: Double = 

    var dept: Department?

} 

struct Department {     

    var no: Int =  {       

    willSet {             //定义no属性的willSet观察者,注意这里没有声明参数,但是我们可以在观察者内部使用newValue

        print("部门编号新值:\(newValue)")

    }

    didSet {          //定义no属性的didSet观察者,注意这里也没有声明参数,但是我们可以在观察者内部使用oldValue

        print("部门编号旧值:\(oldValue)")    ⑫

    }

    }

    var name: String = "RESEARCH"

} 

var emp = Employee()

emp.no = 

emp.name = "Smith"               ⑬ 

var dept = Department()

dept.no =                      ⑭

上述代码运行结果如下:

员工name新值:Smith

员工name旧值:Tony

部门编号新值:30

部门编号旧值:10

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
  《从零开始学Swift》学习笔记(Day 33)——属性观察者                         ​
更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php