属性观察者willSet和didSet

class People: NSObject {
    //普通属性
    var firstName:String = "";
    var secondName:String = "";
    var nickName:String = "";
    
    init(afirstName:String,aSecondName:String,aNickName:String,aAge:Int) {
        self.firstName = afirstName
        self.secondName = aSecondName
        self.nickName = aNickName
        self.age = aAge
    }
    //与其他大部分编程语言不同,Swift 并不强制要求你在每条语句的结尾处使用分号(;),当然,你也可以按照你自己的习惯添加分号。有一种情况下必须要用分号,即你打算在同一行内写多条独立的语句:
    
    //计算属性
    var fullName:String
    {
        get{
            return firstName+secondName+nickName
        }
    }
    
    //带属性监视器的普通属性
    var age:Int = 0
        {
            willSet//age属性变化前
            {
                print("willSet=============\(newValue)")
            }
        
        didSet//age属性变化后
        {
            print("didSet=========\(oldValue)")
            if age>10 {
                nickName = "大"
            } else {
                nickName = "小"
            }
        }
    }
    
    func peopleFunc() -> String {
        return "fullName============\(fullName)age============\(age)"
    }

}
    属性观察者,类似于触发器。用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应。有如下特点:
     1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet。
     2,给属性添加观察者必须要声明清楚属性类型,否则编译器报错。
     3,willSet可以带一个newName的参数,没有的话,该参数默认命名为newValue。
     4,didSet可以带一个oldName的参数,表示旧的属性,不带的话默认命名为oldValue。
     5,属性初始化时,willSet和didSet不会调用。只有在初始化上下文之外,当设置属性值时才会调用。
     6,即使是设置的值和原来值相同,willSet和didSet也会被调用
     原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_519.html

测试

        let apeople = People(afirstName: "first", aSecondName: "second", aNickName: "nick", aAge: 20)
        print("\(apeople.peopleFunc())");

你可能感兴趣的:(属性观察者willSet和didSet)