使用 CoreData 生成器复制 DerivedData 文件夹中的文件

Duplicate files in DerivedData folder using CoreData generator

我正在尝试从我的数据模型生成 NSManagedModels。一代作品,但在我遇到很多错误之后:

error: filename "Station+CoreDataProperties.swift" used twice: '/Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.swift' and '/Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station+CoreDataProperties.swift' :0: note: filenames are used to distinguish private declarations with the same name

我尝试清理构建文件夹和硬删除 derivedData 目录。我正在使用 Xcode 8 BETA 也许这是一个错误?

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

来自 Xcode 8.0 发行说明:

Xcode automatically generates classes or class extensions for the entities and properties in a Core Data data model. Automatic code generation is enabled and disabled on an entity by entity basis, and is enabled for all entities in new models that use the Xcode 8 file format. This feature is available for any data model that has been upgraded to the Xcode 8 format. You specify whether Xcode generates Swift or Objective-C code for a data model using the data model’s file inspector.

When automatic code generation is enabled for an entity, Xcode creates either a class or class extension for the entity as specified in the entity's inspector: the specified class name is used and the sources are placed in the project’s Derived Data. For both Swift and Objective-C, these classes are directly usable from the project’s code. For Objective-C, an additional header file is created for all generated entities in your model. The header file name conforms to the naming convention “DataModelName+CoreDataModel.h”.

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

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

这确实不是一个错误。正如@Morrowless 建议的那样,class 定义和属性扩展都已创建。如果不需要,select Manual/None 在 Codegen before 生成代码之前。如果代码已经生成,只需删除它们,然后从菜单中再次尝试 Editor->Create NSManagedObject Subclass...(设置 Manual/None 后)。

请注意,在下图中,Class 名称 'Contact' 是特定于我的项目的。您将看到您的实体名称。

我在 Xcode 8.1 中得到了这个 对我来说,以下步骤解决了这个问题。请注意顺序很重要。

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

2) 在class部分下,如下图进行设置。

模块:当前产品名称

代码生成:Manual/None

3) 生成你的 NSManagedObject 子class.

按照 oyalhi 和 Vladimir Shutyuk 的指导,(删除 NSManagedObject 文件,将实体 codegen 更改为 Manual/None),我不得不重新启动 Xcode在我重新生成 NSManagedObject 文件并成功编译之前允许它再次索引。

这个post极大地帮助我自己解决了这个问题。我个人认为这是一个 Xcode 错误。不管是否有错误,这是一个巨大的先有鸡还是先有蛋的情况。

我 运行 通过:

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

正如其他人 posted 我一直在清理我的构建(和 clean build folder),但这从未解决构建问题。

我终于弄清楚如果你最初创建你的 NSManagedObject 生成 类 与 codegen: ClassDefinition,就像我在不知道的情况下所做的那样,那么你就陷入了先有鸡还是先有蛋的问题。

然后我删除了自动生成的类我不得不重新生成,所以我做了。重新生成后,我会再次收到 used twice 构建错误。我手动进入 ../DerivedSources/CoreDataGenerated/Model/.. 并删除了 重复项 。再一次,我重新产生了我只有 1 个副本(在我的项目中)的想法,但我错了。如果最初设置了 codegen: ClassDefinition,那么 Xcode 将继续创建 auto-generated 类+ 扩展并将它们放入隐藏文件夹 ../DerivedSources/CoreDataGenerated/Model/.. 中。在流行起来之前,我重复了几次这个鸡和鸡蛋。

我后来意识到你确实需要标记 codegen: Manual/None 但是为了让事情恢复同步你需要删除 ../DerivedSources/CoreDataGenerated/Model/.. 和你的项目中的自动生成的文件,如果你有的话仍然。

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

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

希望这对其他人有帮助!

干杯!

如果您使用 codegen: ClassDefinition 生成 CoreData 子类,您基本上就完蛋了。修复它的唯一方法是:

  1. 删除您的 CoreData 子类。
  2. 删除派生数据文件夹。
  3. 清理您的项目 (CMD+K)。
  4. 生成新的CoreData子类,这次selectCodegen: Manual/NoneModule: Current Product Module

为了完整起见..:[=​​10=]

我只是 运行 遇到了同样的错误,但是 none 的建议解决方案有效。令我困惑的是,即使从自动代码生成切换到手动生成(如我所想)有问题的实体也没有做任何事情。

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

原来 XCode 通过将 1、2... 添加到实体名称来重命名重复项,但像以前一样保留 class 名称。由于现在实体名称和 class 名称为 "unrelated",因此重命名实体也不会更改 class 名称。

希望它对某人有所帮助 - 我还为此提交了错误报告。