美文网首页
Swift之属性观察[willSet&didSet]

Swift之属性观察[willSet&didSet]

作者: XiaoBaa | 来源:发表于2018-11-03 01:59 被阅读46次

    GitHub Demo: https://github.com/BaHui/BHSwifter

    简介

    在Swift语言中用了 willSetdidSet 这两个特性来监视属性除初始化之外的变化

    • willSet: 属性改变之前触发, 拥有newValue默认参数
    • didSet: 属性改变之后触发, 拥有oldvalue默认参数

    使用方法:

    // MARK: - 定义一个Person类
    class BHPerson: NSObject {
    
        var name: String? {
            willSet {
              print("willSet: 新值 -> \(String(describing: newValue))")
            }
            didSet {
              print("didSet: 原值 -> \(String(describing: oldValue))")
            }
         }
    
    }
    
    // MARK: - 创建Person实例, 并修改name值
      func test1() {
        let person = BHPerson()
        person.name = "小张"
        /* 输出
         *  willSet: 新值 -> Optional("小张")
         *  didSet: 原值 -> nil
         */
        
        person.name = "小王"
        /* 输出
         *  willSet: 新值 -> Optional("小王")
         *  didSet: 原值 -> Optional("小张")
         */
      }
    

    注意点

    ① 属性初始化时,willSet和didSet都不会调用,只有在属性被赋值时才会调用;
    ② 当设置的值和原来的值一样时,willSet和didSet也会被调用;

    验证①:

    // MARK: - 仅初始化实例
      func test2() {
        let _ = BHPerson()
      }
       // 无输出结果
    
    结论: 仅初始化不会触发属性观察者.
    

    验证②:

    // MARK: - 为实例赋值相同name值
     func test3() {
        let person = BHPerson()
        person.name = nil
      }
        /* 输出
         *  willSet: 新值 -> nil
         *  didSet: 原值 -> nil
         */
    
    结论: 当设置的值和原来的值一样时,willSet和didSet也会被调用;
    

    交流与建议

    相关文章

      网友评论

          本文标题:Swift之属性观察[willSet&didSet]

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