gpt4 book ai didi

Swift KVO - 观察枚举属性

转载 作者:搜寻专家 更新时间:2023-10-30 22:19:37 25 4
gpt4 key购买 nike

我正在组装一个类,该类具有多个状态(由枚举定义)和一个返回实例当前状态的只读属性“state”。我希望使用 KVO 技术来观察状态的变化,但这似乎不可能:

dynamic var state:ItemState//生成编译时错误:属性不能标记为动态,因为它的类型不能在 Objective-C 中表示

我想我可以将每个状态表示为 Int 或 String 等。但是是否有一种简单的替代解决方法可以保留枚举将提供的类型安全性?

文斯。

最佳答案

也许这仅在 swift 2+ 中可用,但您可以使枚​​举属性直接可观察,而无需引用其 rawValue。然而,它确实有一些限制。

  1. 让包含的类从 NSObject 扩展(直接或间接)
  2. @objc标记枚举
  3. Int 扩展枚举
  4. 将属性声明为dynamic
class SomeModel : NSObject {                          // (1) extend from NSObject
@objc // (2) mark enum with @objc
enum ItemState : Int, CustomStringConvertible { // (3) extend enum from Int
case Ready, Set, Go

// implementing CustomStringConvertible for example output
var description : String {
switch self {
case .Ready: return "Ready"
case .Set: return "Set"
case .Go: return "Go"
}
}
}

dynamic var state = ItemState.Ready // (4) declare property as dynamic
}

其他地方:

class EnumObserverExample : NSObject {
private let _model : SomeModel

init(model:SomeModel) {
_model = model
super.init()
_model.addObserver(self, forKeyPath:"state", options: NSKeyValueObservingOptions.Initial, context: nil)
}
deinit {
_model.removeObserver(self, forKeyPath:"state", context: nil)
}

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if "state" == keyPath {
print("Observed state change to \(_model.state)")
}
}
}

let model = SomeModel()
let observer = EnumObserverExample(model:model)
model.state = .Set
model.state = .Go

输出:

Observed state change to Ready    (because .Initial was specified)
Observed state change to Set
Observed state change to Go

关于Swift KVO - 观察枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27292918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com