我试图观察核心数据实例中对象的任何变化。这是我的代码:
class MyClass {
@objc dynamic var str: String?
}
final class Article: NSObject {
@objc dynamic var title: String?
@objc dynamic var summary: String?
var myVar: MyClass?
}
Run Code Online (Sandbox Code Playgroud)
这是我正在实现的观察者:
func update(article: Article) {
titleSubscription = article.publisher(for: \.title).sink { value in
print(value)
} receiveValue: { _ in
print("I got something")
}
summarySubscription = article.publisher(for: \.myVar?.str).sink{ _ in
} receiveValue: { _ in
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
Thread 1: Fatal error: Could not extract a String from KeyPath Swift.KeyPath<Examples.Article, Swift.Optional<Swift.String>>
Run Code Online (Sandbox Code Playgroud)
你们中有人知道为什么我会收到此错误或者是否有任何解决方法?
我将非常感谢你的帮助。
Sco*_*son 17
您正在尝试创建一个使用键值观察的发布者。键值观察是 Objective-C 运行时的一项功能。通过放置和,您已经将属性title和暴露summary给了 Objective-C 运行时。 然而,它是一个普通的实例变量,而不是一个可观察的属性。因此键值编码系统无法找到它,并且在运行时会出现错误。@objcdynamicmyVar
文档位于
说
注释属性以进行键值观察
使用 @objc 属性和动态修饰符标记要通过键值观察来观察的属性。
此外,要参与键值编码,MyClass 还必须可供 Objective-C 使用,并且还必须标记您希望从键值观察访问的属性:
class MyClass : NSObject {
@objc dynamic var str: String?
}
final class Article: NSObject {
@objc dynamic var title: String?
@objc dynamic var summary: String?
@objc dynamic var myVar: MyClass?
}
Run Code Online (Sandbox Code Playgroud)