首先需要知道的是, KVO, KVC 都是Objective-C 運行時的特性, Swift 是不具有的, 想要使用, 必須要繼承 NSObject, 自然, 繼承都沒有的結(jié)構(gòu)體也是沒有 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 為了效率, 默認禁用了動態(tài)派發(fā), 因此想用 Swift 來實現(xiàn) KVO, 我們還需要做額外的工作, 那就是將想要觀測的對象標(biāo)記為 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