gpt4 book ai didi

objective-c - 成员 'observe' 不能用于协议(protocol)类型的值;改为使用通用约束

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:16 27 4
gpt4 key购买 nike

我正在尝试在 Swift 中观察一个属性(在 Objective-C 中声明)。

Objective-C 协议(protocol):

@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
}
}
}

有趣的是我收到一个错误:
成员“observe”不能用于协议(protocol)类型“NSObject & DemoViewModel”的值;改为使用通用约束

知道发生了什么事吗?

谢谢

最佳答案

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

关于objective-c - 成员 'observe' 不能用于协议(protocol)类型的值;改为使用通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496813/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com