创建NSManagedObject子类后,程序无法编译

时间:2018-11-15 18:35:23

标签: ios swift xcode macos core-data

当我创建NSManagedObject子类时,该程序不想编译时出现一个未分类的错误-

"Command CompileSwiftSources failed with a nonzero exit code" 

并且还会为每个子类文件创建一个错误,指出“

Multiple commands produce '/Users/myName/Library/Developer/Xcode/DerivedData/CoreDataError-cqtxdlgmsibvltbxuxzvrapubhlp/Build/Intermediates.noindex/CoreDataError.build/Debug-iphonesimulator/CoreDataError.build/Objects-normal/x86_64/Person+CoreDataProperties.o':

这是我的数据模型。 enter image description here My data model

这是错误日志 enter image description here

我试图将构建设置更改为“旧版构建系统”,但这也无济于事。

1 个答案:

答案 0 :(得分:0)

在大多数情况下,这实际上是在您确实两次创建NSManagedObject类(或其属性)时发生的。

在您的情况下,由于使用了Editor菜单命令,您已经为Friend和Person类创建了代码。然后,您已将这些模块集成到项目中。因此,编译器会编译这些类。

但是

很可能您没有更改CoreData类的生成选项。您可以在检查器的“ CoreData”窗格中找到此选项(“类”部分,“代码生成”菜单)。它可以包含3个值:“手动/无”,“类定义”或“类别/扩展名”。

我想您已经使用了默认的“类定义”,这意味着当XCode编译您的模型时,它会为您的每个实体临时生成swift模块,然后编译这些模块。因此,最终得到2个名为“ Friend”的模块和2个名为“ Person”的模块。因此出现错误。

您要使用编辑器生成的模块,很可能是因为要修改它们,因此应将Codegen菜单设置为“ Manual / None”或“ Category / extension”。 您可以按实体进行操作。

一些一致的用例:

  • 您有一个实体,并且您不想碰任何东西:将“类定义”保留为Codegen选项,并且不要使用编辑器生成类代码,让XCode来完成所有事情。
  • 您有一个实体,并且想要对其进行修改,例如,您想要添加一些aakeakeFromInsert手动代码。但是,您希望XCode在更改属性时继续为其生成访问器。生成模块的代码,将其包括在您的项目中(但不包括属性的扩展名),进行修改,但将“类别/扩展名”保留为生成选项。
  • 您想自己管理一切:一次生成实体代码,将其包含在您的项目中,然后选择“手动/无”。现在请注意,当您更改某些属性/关系时,需要手动维护代码同步。