Swift和KVC

Swift开发中,可以继续使用Objc中的KVC机制。受到的限制是,使用KVC的类必须是继承自NSObject,也就是说这样的Swift的类是不行的:

1
2
3
class MyObject{
...
}

Swift编写KVC步骤

具体写的步骤是(和用Objc是类似的),比如有个类,我们要观察它的属性triggerTime

1
2
class MenuView: UIView {
dynamic var triggerTime=NSDate()

这个属性可以是基本类型,比如Int。需要给属性标示为dynamic

然后,在需要监控这个属性的类中写:

1
menuView.addObserver(self, forKeyPath: "triggerTime", options: .New, context:nil)

这个类还需要覆盖这个方法:

1
2
3
4
5
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if keyPath=="triggerTime"{
//监控属性改变后的操作
}
}

在这个类中,还不要忘记,适当时机要清除观察者:

1
2
3
deinit{
menuView.removeObserver(self, forKeyPath: "triggerTime")
}

Swift的Property Observers

Swift提供了个Property Observers机制,但是,它无法替代KVC/KVO,因为它只能用在当前类的实例属性上。

看一下它的写法:

1
2
3
4
5
6
7
8
9
import Foundation

class MyClaz{
var count:Int=0{
didSet{
println("it's changed")
}
}
}

count属性可以通过willSetdidSet在设置前后处理代码,但是需要注意,这个代码和属性要在同一个类中。

这个功能和KVC/KVO不是针对相同的架构需求的。