我正在尝试观察Swift中的一个属性(在Objective-C中声明)。
Objective-C协议:
@protocol DemoViewModel <NSObject>
@property (nonatomic, strong) NSString *bla;
@end
迅速观察:
@objc public dynamic var vm: (NSObject & DemoViewModel) {
didSet {
vm.observe(#keyPath(DemoViewModel.bla)) { _,_ in
//do something
}
}
}
有趣的是,我收到一个错误:
Member ‘observe’ cannot be used on value of protocol type ‘NSObject & DemoViewModel’; use a generic constraint instead
知道发生了什么吗?
谢谢
答案 0 :(得分:0)
关于observe
函数的内幕必须有一些特殊之处,因为所有函数和方法都可以按自己的方式访问。它要求您改为创建如下内容:
class Foo {
@objc public dynamic var vm: (NSObject & DemoViewModel)?
private var observer: NSKeyValueObservation?
func setVM<T>(_ vm: T) where T: NSObject &: DemoViewModel {
self.vm = vm
observer = vm?.observe(\.bla, options: [.old, .new]) { _, _ in
// do something
}
}
}
实现DemoViewModel
时,请记住需要将bla
标记为dynamic
,否则将不会调用观察者。
class Bar: NSObject, DemoViewModel {
@objc dynamic var bla: String = ""
}