核心数据-使用CoreData gen在DerivedData文件夹中复制文件

我正在尝试从我的数据模型生成NSManagedModels。 生成有效,但是在出现很多错误之后:

错误:文件名“ Station + CoreDataProperties.swift”使用了两次: '/Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.swift'和 '/Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station/CoreDataProperties.swift' :0:注意:文件名用于区分私有 具有相同名称的声明

我尝试清理构建文件夹和派生数据目录硬删除。 我正在使用Xcode 8 BETA,也许是个bug?

Ludovic asked 2020-08-12T02:10:06Z
7个解决方案
71 votes

我在Xcode 8.1中得到了对我来说,以下步骤可以解决问题。 请注意,订单很重要。

1)在核心数据模型中创建实体。

2)在课程部分下,进行如下图所示的设置。

模块:当前产品名称

代号:手动/无

3)生成您的NSManagedObject子类。

enter image description here

Vladimir Shutyuk answered 2020-08-12T02:10:34Z
11 votes

这篇文章极大地帮助了我自己解决这个问题。 我个人将其视为Xcode错误。 不管是不是bug,这都是一个巨大的问题。

我遇到了这个问题:

  1. 使用核心数据创建了一个新项目
  2. 生成了我的NSManagedObject子类和扩展名(而codegen: Manual/None
  3. 我不小心将生成的类保存在错误的文件夹中
  4. 我删除了生成的文件
  5. 在我想要的文件夹中重新生成
  6. 💥-Xcode codegen: Manual/None错误

正如其他人发布的那样,我一直在清理我的构建(和codegen: Manual/None),但这始终没有解决构建问题。

我终于弄清楚了,如果您最初使用codegen: ClassDefinition创建了codegen: Manual/None生成的类,就像我不知道那样做,那么您就陷入了鸡鸡蛋问题。

然后,我删除了自动生成的类,以为必须重新生成,所以我做到了。 重新生成后,我将再次收到codegen: Manual/None构建错误。 我手动进入codegen: ClassDefinition并删除了重复项。 再次,我重新生成以为我只有1个副本(在我的项目中),但是我错了。 如果最初设置了codegen: Manual/None,那么Xcode将继续创建../DerivedSources/CoreDataGenerated/Model/..类和扩展,并将它们放入埋藏的文件夹../DerivedSources/CoreDataGenerated/Model/..中。在继续之前,我重复了几次此鸡和鸡蛋。

后来我意识到您确实确实需要标记codegen: Manual/None,但是要使内容恢复同步,您需要删除codegen: ClassDefinition和项目中的自动生成的文件(如果仍有)。

小心设置codegen: Manual/None,对我来说这有点棘手,因为codegen: ClassDefinition不会粘住。 我必须多次在实体之间来回单击以两次/三次检查每个实体是否设置为codegen: Manual/None。然后自动生成文件。 此时,您自动生成的文件的唯一副本应该在您的项目中,而不是在../DerivedSources/CoreDataGenerated/Model/..中。

最后,我认为这是一个错误,因为如果您指定codegen: Manual/None,我不希望Xcode完全自动生成文件,但是它确实会将文件放入您的项目中。 如果您的设置是codegen: ClassDefinition,那会更令人困惑,谁知道Xcode会将文件放在隐藏目录中,但可以在您的项目中使用。 我最喜欢的是,自动生成的文件不受源代码控制,如果我更换计算机,我必须知道在新工作站上自动生成文件。

希望这对别人有帮助!

干杯!

kev answered 2020-08-12T02:12:02Z
8 votes

这确实不是错误。 正如@Morrowless所建议的那样,将同时创建类定义和属性扩展。 如果不希望这样做,请在生成代码之前选择Codegen下的Manual / None。 如果代码已经生成,则将其删除,然后从菜单中再次尝试Editor->Create NSManagedObject Subclass...(在设置“手动/无”之后)。

请注意,在下图中,类名“联系人”特定于我的项目。 您将看到您的实体名称。

enter image description here

oyalhi answered 2020-08-12T02:12:27Z
5 votes

如果您使用Codegen: Manual/None生成了CoreData子类,那么您基本上就搞砸了。 解决此问题的唯一方法是:

  1. 删除您的CoreData子类。
  2. 删除您的派生数据文件夹。
  3. 清理您的项目(CMD + K)。
  4. 生成新的CoreData子类,这次选择Codegen: Manual/NoneModule: Current Product Module
100grams answered 2020-08-12T02:13:05Z
3 votes

这不是错误。 Codegen在DerivedData文件夹中生成这些文件,因此您无需在项目中再次创建它们,因此会产生编译错误。

从Xcode 8.0发行说明:

Xcode为Core Data数据模型中的实体和属性自动生成类或类扩展。 自动代码生成在每个实体的基础上启用和禁用,并为使用Xcode 8文件格式的新模型中的所有实体启用。 此功能适用于已升级为Xcode 8格式的任何数据模型。 您可以指定Xcode使用数据模型的文件检查器为数据模型生成Swift还是Objective-C代码。

为实体启用自动代码生成后,Xcode会创建 实体中指定的类别或类别扩展名 实体的检查器:使用指定的类名和源 放置在项目的“派生数据”中。 对于Swift和 Objective-C,这些类可直接从项目的 码。 对于Objective-C,将为所有对象创建一个附加的头文件。 模型中生成的实体。 头文件名符合 命名约定为“ DataModelName + CoreDataModel.h”。

但是,如果您在数据模型检查器的代码生成下拉菜单下选择了类别/扩展(因为您想向模型中添加逻辑):代码生成将错误地生成类定义和属性扩展。

解决方案是简单地删除属性扩展名(ClassName + CoreDataProperties.swift)。 您的项目现在应该编译了。

Morrowless answered 2020-08-12T02:14:27Z
0 votes

在遵循oyalhi和Vladimir Shutyuk的指导(删除NSManagedObject文件,将实体codegen更改为Manual/None)之后,我不得不重新启动Xcode以使其再次索引,然后才能重新生成NSManagedObject文件并获得成功的编译。

Jacob Davis answered 2020-08-12T02:14:50Z
0 votes

为了完整性..:

我只是遇到了同样的错误,但是所有提议的解决方案都没有用。 让我感到困惑的是,即使是从一个有问题的实体(如我所认为的)的代码自动生成切换为手动,也无济于事。

最后,我发现我有几个具有相同名称的实体,但是它们都共享相同的类名。 这样做的原因是我多次复制粘贴了一个实体,以节省一些工作,因为它们也有一些共同的属性。

事实证明,XCode通过在实体名称上添加1、2 ...来重命名重复项,但与以前一样保留类名。 并且由于现在实体名称和类名称是“无关的”,因此重命名实体也不会更改类名称。

希望对您有所帮助-我也为此提交了错误报告。

Toastor answered 2020-08-12T02:15:30Z
translate from https://stackoverflow.com:/questions/38190360/duplicate-files-in-deriveddata-folder-using-coredata-generator