【问题标题】: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 在您更改属性时继续为属性生成访问器。为模块生成代码,将其包含在您的项目中(但不是属性的扩展名),修改它,但保留“类别/扩展名”作为生成选项。
  • 您想自己管理一切:生成一次实体代码,将其包含在您的项目中,然后选择“手动/无”。现在请注意,当您更改某些属性/关系时,您需要手动保持代码同步。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2023-04-03
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多