有时候我们需要在运行中动态传递一个属性的信息,就比如KVO模式下,我们为了让一个类的属性能够进行消息监听,需要做什么呢?
先来看下面一段代码
class KVODemoClass: NSObject {
var number = 1
}
class Test: NSObject {
var kvo: KVODemoClass
override init() {
kvo = KVODemoClass()
super.init()
kvo.addObserver(self, forKeyPath: "number", options: .New, context: nil)
}
deinit {
kvo.removeObserver(self, forKeyPath: "number")
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "number" {
print("change")
}
}
}
let test = Test()
test.kvo.number = 2
这是一个非常简单的KVO实现代码,但是运行后控制台什么都没打印。说好的打印change呢?
其实回过头来想一想,Swift默认设定属性为静态的,即使继承了NSObject对象,因此如果我们想让一个属性能够得到动态监听,只要把最前面相应的类代码修改为
class KVODemoClass: NSObject {
dynamic var number = 1
}
于是你会惊喜地发现控制台输出change了,不是么?