使用 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 错误。不管是否有错误,这是一个巨大的先有鸡还是先有蛋的情况。
我 运行 通过:
- 使用核心数据创建了一个新项目
- 生成了我的
NSManagedObject
子类+扩展(而 codegen: ClassDefinition
)
- 我不小心将生成的 类 保存在错误的文件夹中
- 我删除了生成的文件
- 在我想要的文件夹中重新生成
- - 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 子类,您基本上就完蛋了。修复它的唯一方法是:
- 删除您的 CoreData 子类。
- 删除派生数据文件夹。
- 清理您的项目 (CMD+K)。
- 生成新的CoreData子类,这次select
Codegen: Manual/None
和Module: Current Product Module
为了完整起见..:[=10=]
我只是 运行 遇到了同样的错误,但是 none 的建议解决方案有效。令我困惑的是,即使从自动代码生成切换到手动生成(如我所想)有问题的实体也没有做任何事情。
最后,我发现我有几个具有相同 name 的实体,但它们都共享相同的 classname.这样做的原因是我多次复制和粘贴一个实体以节省一些工作,因为它们也有一些共同的属性。
原来 XCode 通过将 1、2... 添加到实体名称来重命名重复项,但像以前一样保留 class 名称。由于现在实体名称和 class 名称为 "unrelated",因此重命名实体也不会更改 class 名称。
希望它对某人有所帮助 - 我还为此提交了错误报告。
我正在尝试从我的数据模型生成 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 错误。不管是否有错误,这是一个巨大的先有鸡还是先有蛋的情况。
我 运行 通过:
- 使用核心数据创建了一个新项目
- 生成了我的
NSManagedObject
子类+扩展(而codegen: ClassDefinition
) - 我不小心将生成的 类 保存在错误的文件夹中
- 我删除了生成的文件
- 在我想要的文件夹中重新生成
- - 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 子类,您基本上就完蛋了。修复它的唯一方法是:
- 删除您的 CoreData 子类。
- 删除派生数据文件夹。
- 清理您的项目 (CMD+K)。
- 生成新的CoreData子类,这次select
Codegen: Manual/None
和Module: Current Product Module
为了完整起见..:[=10=]
我只是 运行 遇到了同样的错误,但是 none 的建议解决方案有效。令我困惑的是,即使从自动代码生成切换到手动生成(如我所想)有问题的实体也没有做任何事情。
最后,我发现我有几个具有相同 name 的实体,但它们都共享相同的 classname.这样做的原因是我多次复制和粘贴一个实体以节省一些工作,因为它们也有一些共同的属性。
原来 XCode 通过将 1、2... 添加到实体名称来重命名重复项,但像以前一样保留 class 名称。由于现在实体名称和 class 名称为 "unrelated",因此重命名实体也不会更改 class 名称。
希望它对某人有所帮助 - 我还为此提交了错误报告。