Swift 中的KVO

2019-10-14  本文已影响0人  绍清_shao

基本类型的监听 包括String、Int、数组等等

Person为被监听的对象,name被监听的属性

class Person: NSObject {

    @objc dynamic var name: String

    init(name: String) {
        self.name = name
    }

}

KVO是基于KVC(Key-Value Coding)以及动态派发技术实现,所以class要继承NSObject,需要监听属性的对象要标记为@objc dynamic

ViewController为监听者,需要监听Personname的变化

class ViewController: UIViewController {

    var person: Person!
    var observation: NSKeyValueObservation?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        person = Person(name: "name")
        observation = person.observe(\Person.name, options: [.new,.old], changeHandler: { (p, change) in
            if let name = change.oldValue {
                print("旧名字:" + name)
            }
            if let name = change.newValue {
                print("新名字:" + name)
            }
        })
        
    }
    
    @IBAction func tap(_ sender: UIButton) {
        person.name = "shao"
    }

}
// 打印结果
旧名字:name
新名字:shao

Enum类型

需要做个转换

class ViewModel: NSObject {
    
    enum AnEnumType : String {
        case enumA = "A"
        case enumB = "B"
    }
    // 监听类型为
    @objc dynamic private(set) var anEnumRaw : String = ""
    
    var anEnumType : AnEnumType? {
        
        didSet {
            anEnumRaw = anEnumType?.rawValue ?? "none"
        }
        
    }
    
}

参考链接

Smart KeyPaths
Swift KVO - Observing enum properties

上一篇 下一篇

猜你喜欢

热点阅读