Swift 下的 KVO , KVC

首先需要知道的是, KVO, KVC 都是Objective-C 运行时的特性, Swift 是不具有的, 想要使用, 必须要继承 NSObject, 自然, 继承都没有的结构体也是没有 KVO, KVC 的, 这是前提.
例如, 下面的这段错误代码:

class SimpleClass {
    var someValue: String = "123"
}
//SimpleClass().setValue("456", forKey: "someValue") // 错误, 必须要继承自 NSObject

KVC

Swift 下的 KVC 用起来很简单, 只要继承 NSObject 就行了.

class KVCClass :NSObject{
    var someValue: String = "123"
}
let kvc = KVCClass()
kvc.someValue // 123
kvc.setValue("456", forKey: "someValue")
kvc.someValue // 456

KVO

KVO 就稍微麻烦一些了,由于 Swift 为了效率, 默认禁用了动态派发, 因此想用 Swift 来实现 KVO, 我们还需要做额外的工作, 那就是将想要观测的对象标记为 dynamic.

class KVOClass:NSObject {
    dynamic var someValue: String = "123"
    var someOtherValue: String = "abc"
}

class ObserverClass: NSObject {
    func observer() {
        let kvo = KVOClass()
        kvo.addObserver(self, forKeyPath: "someValue", options: .new, context: nil)
        kvo.addObserver(self, forKeyPath: "someOtherValue", options: .new, context: nil)
        kvo.someValue = "456"
        kvo.someOtherValue = "def"
        kvo.removeObserver(self, forKeyPath: "someValue")
        kvo.removeObserver(self, forKeyPath: "someOtherValue")
    }
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        print("\(keyPath!) change to \(change![.newKey] as! String)")
    }
}
ObserverClass().observer()

这段代码只会输出someValue change to 456
demo https://github.com/ywwzwb/SwiftKVOKVCDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文: Method Dispatch in Swift作者: Brain King译者: kemchenj 译者...
    kemchenj阅读 13,085评论 11 91
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,229评论 4 61
  • 前言: 最近几天在看《100个Swift必备tips》这本书,本篇为读书笔记,以作总结记录用。 将protocol...
    Wang66阅读 4,763评论 0 5
  • 【本文由本人原创,转载请注明出处】 1、在终端输入以下命令,打开 vi 编辑器 $ cd ~$ touch .ba...
    起了阅读 3,523评论 1 0
  • 晚上九点 天空还没有黑下来 关着灯躺在床上 透过窗户 蓝的深邃 闭眼回到了20年前 这样的夏天该是放暑假了 依然是...
    Greece姑娘阅读 708评论 0 0