Swift 组合:无法从 KeyPath Swift.KeyPath 中提取字符串

use*_*482 12 swift combine

我试图观察核心数据实例中对象的任何变化。这是我的代码:

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

文档位于

https://developer.apple.com/documentation/swift/cocoa_design_patterns/using_key-value_observing_in_swift/

注释属性以进行键值观察

使用 @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)