在哪里为 Swift 中的核心数据实现 NSValueTransformer

Posted

技术标签:

【中文标题】在哪里为 Swift 中的核心数据实现 NSValueTransformer【英文标题】:Where to implement NSValueTransformer for Core Data in Swift 【发布时间】:2016-07-15 16:48:01 【问题描述】:

我正在尝试将实体放在每个具有非标准数据类型的核心数据存储中 - 一个是 NSDocument,另一个是 NSURL。我在 .xcdatamodeld 中得到了这一点,我需要将它们声明为可转换的。而且我认为我需要添加一些实现 NSValueTransformer 以将它们转换为 NSData 的东西(......或者是否有一个默认的转换器会自动执行此操作?)

我认为这个问题应该很容易回答:我在哪里实现它?我还没有在 Swift 中找到一个明确的例子。有一个Objective-C example,但 .h 和 .m 文件的分离让我不清楚这在 Swift 中会出现在哪里。

假设我有一个名为 Notebook 的实体类型,它有一个名为 folderURL 的属性——在数据库中属于 Transformable 类型,在实际变量中属于 NSURL 类型。 (我使用它作为示例,因为它更简单 - 请不要告诉我只是将 NSURL 转换为字符串,因为这不适用于其他 Transformable。)

问题是:假设我需要一个文件夹 URL 的 NSValueTransformer,我应该把它放在哪里? Notebook应该实现它吗? Notebook+CoreDataProperties 应该吗?或者我是否需要一个名为 FolderURL 的单独子类来实现它,如果需要,我如何在 Notebook(和/或 Notebook+CoreDataProperties)中引用该子类?

(之前有一个similar title 的问题,但他们似乎已经比这更进一步了——他们没有询问或展示“哪里”。)

【问题讨论】:

【参考方案1】:

“位置”就在您项目中的任何位置。确保您的NSValueTransformer 子类在运行时存在的任何地方。实现NSValueTransformer子类,在Core Data模型中输入类名作为值转换器。

然而一个默认的转换器。任何采用NSCoding 协议的类都可以被Core Data 自动转换。在这种情况下,您将属性标记为可转换但不包含类名。这包括NSURL,因此您无需对其进行转换或将其转换为字符串。

那么对于您的 NSDocument 子类,您可以选择在类中实现 NSCoding 或为文档类型实现 NSValueTransformer 子类。

【讨论】:

以上是关于在哪里为 Swift 中的核心数据实现 NSValueTransformer的主要内容,如果未能解决你的问题,请参考以下文章

swift中的核心数据关系

UITabBarController 应用程序中 iCloud 同步的核心数据堆栈实现 (Swift 1.2)

Swift - 将 nil 核心数据字符串转换为可选值

单个条目中的多个图像 - Swift 中的核心数据

使用 NSPredicate 对表视图中的核心数据进行排序 (Swift)

Swift 3 中的核心数据属性验证