Xcode-beta 8.无法创build核心数据

我一直在试图添加核心数据。 每次我得到同样的错误:

error: filename "EntityName +CoreDataClass.swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.swift' 

我使用以下步骤添加核心数据:
1.新文件/ DataModel; 保存在我的项目的根目录
selectModel.xcdatamodeld并添加实体,添加几个属性,保存,编辑器/创buildNSManagedObjectClass子类。

因此,我在导航器中观察到4个新文件:Model.xcdatamodeld,EntityName + CoreDataProperties.swift,EntityName + CoreDataClass.swift, _COREDATA_DATAMODELNAME_ + CoreDataModel.swift

他们的内容: _COREDATA_DATAMODELNAME_ + CoreDataModel.swift:

 import Foundation import CoreData ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___ 

EntityName + CoreDataClass.swift:

 import Foundation import CoreData class EntityName: NSManagedObject { } 

实体名称+ CoreDataProperties.swift:

 import Foundation import CoreData extension EntityName { @nonobjc class func fetchRequest() -> NSFetchRequest< EntityName > { return NSFetchRequest< EntityName >(entityName: "EntityName"); } @NSManaged var str: String? } 

我曾经尝试过:
1.清理构build,删除DerivedData,删除var /文件夹的内容,重新启动
2.删除生成的文件,显示在导航器中

我所有的努力都是运气不好的。
我做错了什么?

当模型文件使用Xcode 8文件格式时,Xcode 8包括自动NSManagedObject类的生成。 如果你创build你自己的子类文件,你正在创build重复。 DerivedSources错误消息中的第二个文件是Xcode自动创build的文件。

如果自动生成的文件做你所需要的,只是停止创build自己的,你会没事的。

如果你想创build自己的子类,你也可以

  • 将模型文件的“工具版本”设置为Xcode 7.3或更低版本以禁用所有代码生成(这似乎没有改变对于实际文件内容有意义的任何内容),或者
  • 通过将实体的“Codegen”设置为“Manual / None”,为每个实体单独禁用自动生成。

XCode 8中有两个错误:

1 – 如果您更改Codegen下拉菜单,则新值不保存在Model.xcdatamodel中。 你必须改变别的东西才能保存。 例如更改类名称; build立; 改回class级名称; 重新build立。

2 – 生成的代码放置在Intermediates文件夹的DerivedData中,但只有在文件夹不存在的情况下才会发生。 解决方法是做一个干净的然后构build。

我实际上有同样的问题(使用Swift),并怀疑这是一个错误。 如果我理解正确的OP是使用Xcode的自动NSManagedObject子类,并没有随后创build额外的(多余的)子类似乎是一些混淆的来源。

重现步骤:

  1. 创build一个新的项目,单个视图应用程序。 勾选“使用核心数据”

  2. 在模型实体中创build一个实体,添加属性,确保文件被保存(有时如果没有明确保存,Xcode 8 Beta会抛出数据)

  3. select编辑器 – >创buildNSManagedObject子类。 勾选相关的框

Xcode创build3个文件:

  1. COREDATA_DATAMODELNAME_ + CoreDataModel.swift。 该文件已损坏,并包含以下用于导入Foundation和CoreData的无效条目 – 除非删除此文件,否则该项目将无法编译

     import Foundation import CoreData ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___ 
  2. 实体名称+ CoreDataClass.swift

  3. 实体名称+ CoreDataProperties.swift

虽然编辑器此时不会标记任何错误,但由于OP列出的原因(即缺lessDerivedData文件夹中具有相同名称但具有'。'前缀的文件)

如果在创build模型之后手动创buildNSManagedObject子类而不使用Xcode的明显错误的自动生成,则没有任何问题。 多一点打字,但更可靠! 但是,您需要从“干净的”项目开始(即在您试图自动生成子类之前),否则错误仍然存​​在。 清理派生数据不会伤心。

*****更新*****似乎有一些相当奇怪的事情,似乎是最初build议的沉默代码生成(道歉),但这是非常不同的行为,从人们的期望。 而且,这个代码在编辑器中是不可见的(这看起来有点没有意义,也很混乱)。 它在DerivedData> Build> Intermediates> .Build的子文件夹中创build。

我可以完全明白为什么OP是困惑的(就像我!)为什么值得这个“function”无疑是一个有益的尝试,但有点混乱,如果你习惯了以前的行为,并提供一个选项来产生从主菜单中可见和可编辑的副本。

因此,在Codegen窗口(如下所示)中select'Manual / None',然后您可以使用菜单栏中的auto-gen选项(删除'junk'之后)或编写自己的代码。

新的XCode 8 codegen选项

按着这些次序,

  1. 通过将实体的“Codegen”设置为“Manual / None”,为每个实体单独禁用自动生成。

  2. 将实体名称更改为其他名称以便保存。 例如更改类名称; build立; 改回class级名称; 重新build立。

我得到这个错误,

只需在您的文件.xcdatamodeld中将工具版本更改为Xcode 7.3即可

它工作正常!

对于每个人都有麻烦让自动工作:

我必须在实体的用户信息设置上将“com.apple.syncservices.Syncable”设置为“NO”。

也许这有帮助。

Tom Harrington答案是正确的。 但是,有一种方法可以添加自己的函数和/或variables,而不需要执行上述两个选项中的任何一个。

只需创build一个类的扩展 。 (确保你命名的swift文件与标准的自动生成NSManagesObject文件不同)。

例如。 如果你有一个名为MyEntity的实体,你可以添加一个名为MyEntityExtension.swift文件,它看起来像这样:

 import Foundation import CoreData import UIKit extension MyEntity { var color: UIColor { get { return self.colorValue as! UIColor } set { if newValue.isMember(of: UIColor.self) { self.colorValue = newValue } } } } 

尝试了几个贴子的答案后,重新启动我的机器为我工作。