前段时间我遇到了同样的问题。 最后,我使用了一个枚举状态,并添加了一个额外的'原始'属性,由属性观察者在主状态属性中设置。
您可以KVO'原始'属性,但然后引用真正的枚举属性,当它改变。
这显然是一种黑客,但对我来说,这比完全抛弃枚举并失去所有好处要好。
例如。
class Model : NSObject {
enum AnEnumType : String {
case STATE_A = "A"
case STATE_B = "B"
}
dynamic private(set) var enumTypeStateRaw : String?
var enumTypeState : AnEnumType? {
didSet {
enumTypeStateRaw = enumTypeState?.rawValue
}
}
}
补充:
如果你正在写的是正在做的雨燕观察类下面是一个方便的工具类采取一些痛苦的了。 的好处是:
- 无需您的观察员子类NSObject。
- 观察回调代码为封闭,而不是实现 observeValueForKeyPath:BlahBlah ...
- 没有必要,以确保您removeObserver,它照顾你。
实用类被称为KVOObserver
和示例的用法是:
class ExampleObserver {
let model : Model
private var modelStateKvoObserver : KVOObserver?
init(model : Model) {
self.model = model
modelStateKvoObserver = KVOObserver.observe(model, keyPath: "enumTypeStateRaw") { [unowned self] in
println("new state = \(self.model.enumTypeState)")
}
}
}
注[unowned self]
在捕获列表,以避免参考周期。
这里的KVOObserver
...
class KVOObserver: NSObject {
private let callback:()->Void
private let observee: NSObject
private let keyPath: String
private init(observee: NSObject, keyPath : String, callback:()->Void) {
self.callback = callback
self.observee = observee
self.keyPath = keyPath;
}
deinit {
println("KVOObserver deinit")
observee.removeObserver(self, forKeyPath: keyPath)
}
override func observeValueForKeyPath(keyPath: String,
ofObject object: AnyObject,
change: [NSObject : AnyObject],
context: UnsafeMutablePointer<()>) {
println("KVOObserver: observeValueForKey: \(keyPath), \(object)")
self.callback()
}
class func observe(object: NSObject, keyPath : String, callback:()->Void) -> KVOObserver {
let kvoObserver = KVOObserver(observee: object, keyPath: keyPath, callback: callback)
object.addObserver(kvoObserver, forKeyPath: keyPath, options: NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Initial, context: nil)
return kvoObserver
}
}
很好的回答。很好地工作。使用原始值来检测变化,但引用枚举而不是原始数据来确定新状态。我不会那样做的。谢谢。 – 2014-12-04 12:26:39
不客气。花了一段时间才找到解决方案!有一件事要注意:如果你的枚举原始值是Int并且你希望你的属性是可选的,你不能使用它,因为你不能有一个Int?财产如同动态。 – 2014-12-04 12:31:49
虽然,你可以转换为NSNumber?我猜。 – 2014-12-04 12:56:26