【问题标题】:Program doesn't compile after creating NSManagedObject subclasses创建 NSManagedObject 子类后程序无法编译
【发布时间】:2019-04-18 22:27:57
【问题描述】:
当我创建 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':
这是我的数据模型。
这是错误日志
我尝试将构建设置更改为旧版构建系统,但也没有用。
【问题讨论】:
标签:
ios
swift
xcode
macos
core-data
【解决方案1】:
大多数情况下,当您确实创建了两次 NSManagedObject 类(或其属性)时,就会发生这种情况。
在您的例子中,由于编辑器菜单命令,您已经为 Friend 和 Person 类创建了代码。然后,您将这些模块集成到您的项目中。所以编译器编译这些类。
但是
很可能,您没有更改 CoreData 类生成选项。您可以在检查器的 CoreData 窗格中找到此选项(Class 部分,Codegen 菜单)。它可以取 3 个值:“Manual/None”“Class Definition”或“Category/extension”。
我猜你一直使用默认的“类定义”,这意味着当 XCode 编译你的模型时,它会临时为你的每个实体生成 swift 模块,并编译这些模块。因此,您最终得到 2 个名为“Friend”的模块和 2 个名为“Person”的模块。因此错误。
您想使用编辑器生成的模块,很可能是因为您想修改它们,那么您应该将 Codegen 菜单设置为“Manual / None”或“Category / extension”。
您可以针对每个实体执行此操作。
一些一致的用例:
- 您有一个实体,但您只是不想接触任何东西:将“类定义”保留为 Codegen 选项,不要使用编辑器生成类代码,让 XCode 完成所有工作。
- 您有一个实体,并且您想要修改它,例如,您想要添加一些 awakeFromInsert 手动代码。但是,您希望 XCode 在您更改属性时继续为属性生成访问器。为模块生成代码,将其包含在您的项目中(但不是属性的扩展名),修改它,但保留“类别/扩展名”作为生成选项。
- 您想自己管理一切:生成一次实体代码,将其包含在您的项目中,然后选择“手动/无”。现在请注意,当您更改某些属性/关系时,您需要手动保持代码同步。