2016-07-04 92 views
25

我试图从我的数据模型生成NSManagedModels。代作品,但之后我得到了很多错误:使用CoreData生成器在DerivedData文件夹中复制文件

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也许这是一个错误?

+0

尝试删除得出的数据,Xcode中 - >文件 - >项目设置。 – 2016-07-04 18:39:15

+0

@AlvinVarghese点亮我在我的帖子中说硬删除不起作用!谢谢 – Ludovic

+0

检查你的项目目录再次检查'''Station + CoreDataProperties.swift'''不存在两次。 – 2016-07-04 18:57:27

回答

48

我得到这个在Xcode 8.1 对我来说,下面的步骤来解决这个问题。请注意,订单很重要。

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

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

模块:当前产品名称

代码生成:手动/无

3)生成您的NSManagedObject子类。

enter image description here

+3

对于其他人,如果你的Core Data模型是在嵌入式框架中,你需要将'Module'设置为'Global',否则你会最终会有两个版本的子类被编译(Xcode自动生成的,以及你定义的)。当你做这个改变时,确保你重新创建了你的子类!如果你不这样做,你最终会有错误 – toast

+0

太棒了!它的工作! – marko

3

这不是一个错误。 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”.

然而,如果在数据模型检查器的代码生成下拉菜单下选择类别/扩展(因为你要添加逻辑模型):codegen将错误地生成类定义和属性扩展

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

+0

请检查Apple Bug Reporter并重新阅读我的文章!Apple解决了此问题8.1。 – Ludovic

7

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

请注意,在下图中,类名'联系'是特定于我的项目。你会看到你的实体名称。

enter image description here

+0

请检查Apple Bug Reporter并重新阅读我的文章!Apple用8.1解决了这个问题 – Ludovic

+0

刚刚下载8.1添加了一个TestEntity到我的模型并添加了两个属性String和Date,并从菜单创建NSManagedObjectSubclass。不出我意外的是,我仍然得到错误,因为这不是第一位的错误。我上面的解决方案可以解决问题。您需要将'Module'设置为'Current Product Module'和'Codegen'为'Manual/None'。 – oyalhi

+0

手动设置在我的项目中,更新到8.1解决了我的问题。看看bug跟踪器。但如果用户没有设置手动模式,那么它就不是一个bug :) – Ludovic

0

继从oyalhi和弗拉基米尔Shutyuk,(删除NSManagedObject文件,改变实体codegenManual/None)的指导下,我不得不重新启动的Xcode一遍允许索引之前,我可以重新生成NSManagedObject文件并获得成功的编译。

8

这篇文章大大帮助我自己解决了这个问题。我个人认为这是一个Xcode错误。错误与否这是一个巨大的鸡和鸡蛋的情况。使用核心数据

  • 生成的你NSManagedObject子+扩展名(而codegen: ClassDefinition
  • 我不小心保存在错误的文件夹
  • 生成的类

    1. 创建一个新的项目:

      我就遇到了这个由

    2. 我删除了生成的文件
    3. 在我想要的文件夹中重新生成
    4. - Xcode的used twice错误

    正如其他人发布我一直在清理我的版本(和clean build folder),但从来没有固定的构建问题。

    我终于想通了,如果你最初创建的NSManagedObject生成的类与codegen: ClassDefinition,因为我不知道,那么你是因为鸡和鸡蛋问题被锁定。

    然后我删除了自动生成的类想着我不得不重新生成,所以我做了。一旦重新生成,我会再次得到used twice构建错误。我手动进入../DerivedSources/CoreDataGenerated/Model/..并删除重复项。再一次,我重新产生的想法,我只有1份(在我的项目中),但我错了。如果最初设置了codegen: ClassDefinition,则Xcode将继续创建auto-generated类+扩展,并将它们放置在掩埋文件夹../DerivedSources/CoreDataGenerated/Model/..中。我重复了这只鸡和鸡蛋几次,然后才开始。

    我后来意识到确实需要标记​​然而为了让事情恢复同步,您需要删除../DerivedSources/CoreDataGenerated/Model/..和项目中的自动生成文件,如果您还有任何问题。

    小心设置​​,对我来说有点棘手,因为​​不会。我不得不多次在实体之间来回点击来双倍/三重检查每个实体设置为​​。 然后自动生成文件。此时,您自动生成的文件的唯一副本应该位于您的项目中,而不是../DerivedSources/CoreDataGenerated/Model/..

    最后,我认为这是一个错误,因为如果你指定​​我不希望Xcode自动生成文件,但它确实会把它们放到你的项目中。如果你的设置是codegen: ClassDefinition,更让人困惑的是,谁知道Xcode会将这些文件放在一个隐藏的目录中,但它可以在你的项目中使用。我的牛肉与这是自动生成的文件不受源代码控制,如果我改变计算机,我必须知道在新站上自动生成它们。

    希望这可以帮助别人!

    干杯!

    4

    如果您生成的CoreData子类与codegen: ClassDefinition你的基本拧。修复它的唯一方法是:

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

    他没有搞砸删除'DerivedData',将每个实体的'Codegen'属性更改为'Manual/None',然后清理和构建就可以完成。并重新创建CoreData子类。 –

    相关问题