在哪里为 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的主要内容,如果未能解决你的问题,请参考以下文章
UITabBarController 应用程序中 iCloud 同步的核心数据堆栈实现 (Swift 1.2)