向 Xcode 10 Core Data 生成的文件添加方法

Posted

技术标签:

【中文标题】向 Xcode 10 Core Data 生成的文件添加方法【英文标题】:Adding a method to an Xcode 10 Core Data generated file 【发布时间】:2019-04-22 14:27:32 【问题描述】:

这个问题可能在别处有答案,但我只找到过时版本的 Xcode 或使用 Swift 的项目的答案。

我正在使用 Xcode 10 并阅读 ios Programming The Big Nerd Ranch Guide, 4th Edition。我正在使用这么旧的版本,因为这是我的工作提供给我的资源。

目前我正在尝试将一个方法添加到为 Objective-C 生成的 CoreData 类。

将 CodeGen 设置为 Category/Extension 并在 CoreData 中选择我的实体,生成的类文件是:

BNRItem+CoreDataProperties.h/m BNRItem+CoreDataClass.h/m

BNRItem+CoreDataClass.h 包括BNRItem+CoreDataProperties.hBNRItem+CoreDataProperties.h 包括BNRItem.h(不存在)。我假设我需要创建BNRItem.h,但我不知道要将哪个文件导入BNRItem.h,因为BNRItem+CoreDataProperties.hBNRItem+CoreDataClass.h 似乎会创建一个循环包含循环。

在 Xcode 10 中,我应该在哪个文件中为 CoreData 生成的 Objective-C 类添加实例方法?

【问题讨论】:

【参考方案1】:

惯例是在.h 文件中使用@class,在.m 文件中使用#import,除非#import.h 文件中是必需的。后者在引用超类或协议时出现。

这个想法是为了加快重新编译。如果ClassA.h 导入ClassB.m,而您在开发过程中只更改ClassB.m,那么由于ClassA.m 导入ClassA.h 导入ClassB.mClassA.m 将需要在下一次构建期间重新编译,即使它没有改变。

当然,所有这些都在 Swift 中消失了 :)

【讨论】:

【参考方案2】:

这可能不是真正的答案,但我通过将 CodeGen 更改为 Manual/None 并编辑它生成的文件来解决此问题。

【讨论】:

【参考方案3】:

将代码生成选项留给Class Definition 并为您的实体创建一个扩展(Objective-C 中的一个类别)怎么样?

【讨论】:

【参考方案4】:

引入了#import 语句来解决#include 创建的循环依赖关系。 所以如果你使用#import没关系,但如果你仍然担心你也可以使用@class前向声明

【讨论】:

【参考方案5】:

这一直是我的挣扎,但刚才我遇到了this Apple article。

第二种方式,是您尝试使用的方式。意外的步骤是将属性文件移动到垃圾箱。实际上,<class>+CoreDataClass 文件似乎必须重命名为 <class>.h.m。之后,您可以使用这些文件来扩展您的类并继续生成属性文件。

所以创建托管对象类的步骤是:

在数据模型检查器中为您的实体选择类别/扩展。 使用Editor > Create NSManagedObject Subclass... 菜单生成您的课程。 移动创建的<class>+CoreDataProperties.h.m 文件。 附加步骤:如前所述重命名数据类文件。

【讨论】:

以上是关于向 Xcode 10 Core Data 生成的文件添加方法的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Xcode 4 中删除 Core Data 动态生成的方法吗?

使用 Core Data 获取生成“无法识别的选择器错误”?

Core Data 生成的类是不是被视为我的“模型”类?

Core Data 代码生成导致构建失败

带有默认 Xcode 12 Core Data 项目的空白白屏

xcode8 beta4 未生成 managedObjectContext