成员'observe'不能用于协议类型的值;改用通用约束



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

最新更新