成员“观察”不能用于协议类型的值;改用通用约束

时间:2019-04-03 13:51:22

标签: objective-c swift

我正在尝试观察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

知道发生了什么吗?

谢谢

1 个答案:

答案 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 = ""
}