我正在尝试观察 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
知道发生了什么吗?
谢谢
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 = ""
}