我需要观察一个Unicorn类(继承自NSObject),但出于商业原因,我不能使用适当的反应框架来获得可观察的属性。 我必须回到KVO(上帝帮助我)。
为了使NOT" stringly-typed",我有一个想法是引入一个名为observableKeyPaths的静态属性,它将为Unicorn类提供所有实际为KVO可观察的keyPath ...使用dot符号
让我们举个例子。 Unicorn类具有可以是KVOed的属性status
。
然后当我设置我的观察者时,我想要像这样引用keypath:
unicornInstance.addObserver(self, forKeyPath: Unicorn.observableKeyPaths.status ...etc..)
我可以想出一个像这样的结构:
struct UnicornObservableKeyPaths {
static let status = "status"
}
可以轻松引用此结构:
UnicornObservableKeyPaths.status
但是如何让这个结构成为该类的一部分呢? 以下内容对我不起作用:
class Unicorn {
dynamic private(set) var status: String
static let observableKeyPaths: UnicornObservableKeyPaths = UnicornObservableKeyPaths()
}
有什么想法吗?我在这里错过了什么? 当我引用静态属性时......我可以访问这个
Unicorn.observableKeyPaths
但不是struct..why的status
静态成员?
答案 0 :(得分:0)
您无法引用静态属性,因为UnicornObservableKeyPaths()
是实际UnicornObservableKeyPaths
而status
是静态变量。
您可以使用
引用结构本身static let observableKeyPaths = UnicornObservableKeyPaths.self
let _ = Unicorn.observableKeyPaths.status
您可以将结构嵌套在类
中class Unicorn : NSObject {
dynamic private(set) var status: String = ""
struct ObservableKeyPaths {
static let status = "status"
}
}
您的观察示例如下所示:
let unicornInstance = Unicorn()
unicornInstance.addObserver(self, forKeyPath: Unicorn.ObservableKeyPaths.status, options: [], context: nil)