美文网首页《从零开始学Swift》学习笔记Tech连载小说
《从零开始学Swift》学习笔记(Day 33)——属性观察者

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

作者: tony关东升 | 来源:发表于2015-11-25 10:08 被阅读145次

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

    为了监听属性的变化,Swift提供了属性观察者。属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到。
    属性观察者主要有以下两个:
     willSet:观察者在修改之前调用。
     didSet:观察者在修改之后立刻调用。
    属性观察者的语法格式如下:
    面向对象类型 类型名 {     
        ...
        var 存储属性: 属性数据类型 = 初始化值 {
        willSet(新值) {   //定义willSet观察者。“新值”是传递给willSet观察者的参数,它保存了将要替换原来属性的新值
            ...
        }        
        didSet(旧值) {  //定义didSet观察者。“旧值”是传递给didSet观察者的参数,它保存了被新属性替换的旧值。
            ...
        }       
        }       

    属性观察者的语法格式比计算属性要混乱。
    属性观察者可以在类和结构体中使用,不能在枚举中使用。
    示例代码如下:
    class Employee { 
        var no: Int = 0
        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 = 0
        var dept: Department?
    }

    struct Department {  
        var no: Int = 10 {  
        willSet {    //定义no属性的willSet观察者,注意这里没有声明参数,但是我们可以在观察者内部使用newValue
            print("部门编号新值:\(newValue)")
        }
        didSet {    //定义no属性的didSet观察者,注意这里也没有声明参数,但是我们可以在观察者内部使用oldValue
            print("部门编号旧值:\(oldValue)")  ⑫
        }
        }
        var name: String = "RESEARCH"
    }

    var emp = Employee()
    emp.no = 100
    emp.name = "Smith"    ⑬

    var dept = Department()
    dept.no = 30      ⑭
    上述代码运行结果如下:
    员工name新值:Smith
    员工name旧值:Tony
    部门编号新值:30
    部门编号旧值:10

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/gborhttx.html