简体   繁体   中英

Swift Combine: Could not extract a String from KeyPath Swift.KeyPath

I'm trying to observer any changes in object in the core data instance. Here is my code:

class MyClass {
    @objc dynamic var str: String?
}

final class Article: NSObject {
    @objc dynamic var title: String?
    @objc dynamic var summary: String?
    var myVar: MyClass?
}

Here is were I'm implementing the observers:

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

But I'm getting this error:

Thread 1: Fatal error: Could not extract a String from KeyPath Swift.KeyPath<Examples.Article, Swift.Optional<Swift.String>>

在此处输入图片说明

Any of you knows why I'm getting this error or if there is any work around ?

I'll really appreciate your help.

You are trying to create a publisher that uses key-value observing. Key-value observing is a feature of the Objective-C runtime. You have exposed the properties title and summary to the Objective-C runtime by putting @objc and dynamic on them. myVar , however, is a plain instance variable, not a observable property. So the key-value coding system can't find it and at runtime you get an error.

The documentation at

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

says

Annotate a Property for Key-Value Observing

Mark properties that you want to observe through key-value observing with both the @objc attribute and the dynamic modifier.

In addition, to participate in key-value coding, MyClass will also have to be available to Objective-C and must have the properties you wish to access from key-key value observing marked too:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM