核心数据:没有为实体 ZZZZ 上的属性 YYYY 找到类名为 XXX 的 NSValueTransformer

Posted

技术标签:

【中文标题】核心数据:没有为实体 ZZZZ 上的属性 YYYY 找到类名为 XXX 的 NSValueTransformer【英文标题】:Core Data : No NSValueTransformer with class name XXX was found for attribute YYYY on entity ZZZZ 【发布时间】:2015-09-15 23:03:13 【问题描述】:

我在 xcdatamodel 文件中设置了我的 CoreData 模型。

我的属性 YYYY 具有可转换类型,我在数据模型检查器中设置了转换器名称。

我在我的模型中存储了一个[CLLocation]

class LocationArrayTransformer : NSValueTransformer 


    override func transformedValue(value: AnyObject?) -> AnyObject? 

        let locations = value as! [CLLocation]

        return NSKeyedArchiver.archivedDataWithRootObject(locations)
    

    override func reverseTransformedValue(value: AnyObject?) -> AnyObject? 

        let data = value as! NSData

        return NSKeyedUnarchiver.unarchiveObjectWithData(data)
    



那是我的价值转换器。

但不知何故,我仍然在控制台中收到警告:No NSValueTransformer with class name XXX was found for attribute YYYY on entity ZZZZ

知道为什么吗?

【问题讨论】:

【参考方案1】:

我花了很多时间才没有分享我找到的解决方案:

我必须使 NSValueTransformer 子类对 Objc 可用。

@objc(LocationArrayTransformer)
class LocationArrayTransformer : NSValueTransformer 
 ....

就这么简单。


正如@Sbooth 所指出的,Swift 类是命名空间的。使用@objc 使类在没有命名空间的情况下可用。所以将转换器名称设置为MyApp.Mytransformer 也很有效!

【讨论】:

Swift 类是命名空间的,使用 @objc 可以使类在没有任何命名空间的情况下可用。如果您通过 Swift 模块名称(通常是您的应用程序的名称)和类:MyCoreDataApp.LocationArrayTransformer 来识别该类,则该类应该在 objc 中可用。 像魅力一样工作!感谢您的提醒! 我最好不要问你花了多少时间来找到这个解决方案,但我可以告诉你,你为我节省了很多。谢谢 正是@objc(LocationArrayTransformer) 解决了问题。谢谢 感谢 2022 年)来自第一个谷歌链接的回答,这些天来的稀有野兽。 )

以上是关于核心数据:没有为实体 ZZZZ 上的属性 YYYY 找到类名为 XXX 的 NSValueTransformer的主要内容,如果未能解决你的问题,请参考以下文章

警告:XXXX 在 YYYY 中具有不同的可见性(默认)和在 ZZZZ 中(隐藏)

两个日期之间实体属性的核心数据总和

创建了核心数据实体但未保存属性

数据插入上的核心数据级联

向核心数据实体添加属性

核心数据异常:向实体添加新属性后出现 SQLite“没有这样的列”错误