美文网首页
Swift 中的KVO

Swift 中的KVO

作者: 绍清_shao | 来源:发表于2019-10-14 08:56 被阅读0次

    基本类型的监听 包括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

    相关文章

      网友评论

          本文标题:Swift 中的KVO

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