在 Swift 中为核心数据实现 NSValueTransformer 的位置

Where to implement NSValueTransformer for Core Data in Swift

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

我觉得这个问题应该很容易回答:我在哪里实现它?我没有在 Swift 中找到这样做的明确示例。有一个 Objective-C example,但是 .h 和 .m 文件的分离让我不清楚它会在 Swift 中的什么位置。

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

问题是:假设我需要一个,我应该把 folderURL 的 NSValueTransformer 放在哪里?笔记本应该实现它吗?应该Notebook+CoreDataProperties吗?或者我是否需要一个名为 FolderURL 的单独子类来实现它,如果是这样,我如何在 Notebook (and/or Notebook+CoreDataProperties) 中引用该子类?

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

"where" 就在您项目的任何地方。确保您的 NSValueTransformer subclass 将在 运行 时间存在的任何地方。实现 NSValueTransformer subclass,并在 Core Data 模型中输入 class 名称作为值转换器。

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

然后,对于您的 NSDocument subclass,您可以选择在 class 中实施 NSCoding 或实施 NSValueTransformer subclass 文档类型。