使用Swift实现KVO

482 阅读1分钟

KVO,也就是键值观察者模式,我们有两种方式来实现它,OC的和非OC的。首先我们实现OC的形式。

第一步:创建一个类KVOClass,然后再定义一个可以被观察的属性,这个属性需要用@objc dynamic来修饰

import UIKit

class KVOClass: NSObject {    

    @objc dynamic var name: String = "xiaoming"

}

第二部:在对应的地方调用他

class ViewController: UIViewController {   

    var ob : NSKeyValueObservation?    
    let kvc: KVOClass = KVOClass()

    override func viewDidLoad() {        
        super.viewDidLoad()        
        ob = kvc.observe(\KVOClass.name, 
                        options: [.old, .new], 
                        changeHandler: { [weak self] (KVOClass, change) in            
            if let oldName = change.oldValue {                
                print("旧名字是---\(oldName)")            
            }            

            if let newName = change.newValue {                
                print("新名字是---\(String(describing: self?.kvc.name))-----\(newName)")            
            }        
        })    
    } 
   
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {        
        kvc.name = "xiaoli"    
    }

}

Swift原生的willSet和didSet就是最直接的键值观察,代码也非常简单。

class KVOClass: NSObject {    

@objc dynamic var name: String = "xiaoming"    
//使用可选类型纯粹是我懒 不想写初始化器 😄
    var age: Int? {        
        willSet {            
            print("\(newValue ?? 0)")        
        }        
        didSet {            
            print("\(oldValue ?? 0)-----\(age ?? 0)")        
        }    
    }
}

这就是我们在Swift里面实现KVO的两种方式,推荐大家用第二种,简单又好用,第一种纯粹是OC的思维去实现的,以后如果更多接触Swift的话,不推荐第一种。