'为CoreData实体创建NSManagedObject子类后的错误

时间:2016-11-23 16:03:56

标签: swift core-data

我创建了2个核心数据实体,然后从编辑器菜单为它们创建了NSManagedObject子类。

然而,当我运行我的应用程序时,由于某种原因,我在所有文件的每一行都出错。

以下是一个示例,这两个实体创建的文件的错误相同。

enter image description here

文件代码是自动生成的,所以我可以在这里使用它但不确定它的使用

    import Foundation
import CoreData


extension UserExercise {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<UserExercise> {
        return NSFetchRequest<UserExercise>(entityName: "UserExercise");
    }

    @NSManaged public var id: Int16
    @NSManaged public var name: String?
    @NSManaged public var reps: Int16
    @NSManaged public var sets: Int16
    @NSManaged public var weight: Int16
    @NSManaged public var relationship: NSSet?

}

// MARK: Generated accessors for relationship
extension UserExercise {

    @objc(addRelationshipObject:)
    @NSManaged public func addToRelationship(_ value: UserRoutine)

    @objc(removeRelationshipObject:)
    @NSManaged public func removeFromRelationship(_ value: UserRoutine)

    @objc(addRelationship:)
    @NSManaged public func addToRelationship(_ values: NSSet)

    @objc(removeRelationship:)
    @NSManaged public func removeFromRelationship(_ values: NSSet)

}

错误是:

  

Command / Applications / Xcode.app / Contents / Developer / Toolchains / XcodeDefault.xctoolchain / usr / bin / swiftc失败,退出代码为1

     

'UserRoutine'的重新声明无效   对于此上下文中的类型查找,“UserExercise”不明确   @NSManaged仅允许在实例属性或方法

上使用

Theres太多了,基本上没有列出这些重复的一遍又一遍

6 个答案:

答案 0 :(得分:17)

Xcode默认为您管理这些子类的生成。如果你想自己管理它们的生成,那么:

  1. 在数据模型中选择您的实体。
  2. 在实用程序窗格(右窗格)中找到 Codegen ,并将其设置为手动/无
  3. 清洁和建造。

答案 1 :(得分:15)

Xcode中的当前默认值是在/Users/<your user name>/Library/Developer/Xcode/DerivedData/AppName-agkwmibzbo‌​pevjgfajlcbyixzyev/B‌​uild/Intermediates/A‌​ppName.build/Debug-i‌​phonesimulator/AppNa‌​me.build/DerivedSour‌​ces/CoreDataGenerate‌​d/Model目录中为您自动创建NSManagedObject的子类; DerivedData目录是Xcode保存自动生成的代码的地方。您通过编辑&gt;创建NSManagedObject子类来重新声明相同的子类...这就是您收到"Invalid redeclaration of 'UserRoutine' 'UserExercise' is ambiguous for type lookup in this context @NSManaged only allowed on an instance property or method"错误的原因。要解决错误并手动创建NSManagedObjects的子类,您需要做的是:

  1. 打开终端并导航至/Users/<your user name>/Library/Developer/Xcode/DerivedData/AppName-agkwmibzbo‌​pevjgfajlcbyixzyev/B‌​uild/Intermediates/A‌​ppName.build/Debug-i‌​phonesimulator/AppNa‌​me.build/DerivedSour‌​ces/CoreDataGenerate‌​d/Model

  2. 运行此命令:rm -rf *(现在要小心这个命令,只有当你到达生成代码的最终目录时才运行它,否则你将破坏你的项目)

  3. 删除当前的数据模型

  4. 创建新数据模型

  5. 选择新数据模型的实体(对数据模型中的每个实体执行此操作)并转到其属性检查器并将其Codegen设置为Manual/None 之前第一次运行在您创建新数据模型之后。

  6. 转到编辑器&gt;创建NSManagedObject子类...

  7. 创建NSManagedObject的子类

    你的错误应该消失。

    希望这有帮助!

答案 2 :(得分:7)

一种适用于我的简单方法....您可以通过选择实体并单击右上角的数据模型检查器来找到这些方法。为所有实体执行此操作 对于FIRST将模块设置为&#34;当前产品模块&#34; AND Codegen to&#34; Manual / None&#34;

只有这样,SECOND:编辑 - &gt;创建NSManagedObject子类。

答案 3 :(得分:2)

这适用于Swift 3.0和Xcode 8.2.1(8C1002)

当您可以直接从Xcode删除文件时,不确定为什么要手动导航到项目。

在项目导航器中的xcdatamodeld中查找所有生成的文件。删除所有文件,并确保您移至垃圾箱,不要删除参考,否则您将不得不手动删除文件:

/用户//库/开发商/ Xcode中/ DerivedData / AppName的-agkwmibzbo pevjgfajlcbyixzyev / B uild /中间体/ A ppName.build/Debug-i phonesimulator / AppNa me.build/DerivedSour CES / CoreDataGenerate d / Model

好的,删除文件后,打开xcdatamodeld,选择所有实体,在Utilities面板中,选择Data Model Inspector按钮,并确保Codegen设置为&#34; Manual /无&#34;

选择你的xcdatamodeld并确保将该Codegen设置为&#34; Manual / None&#34;

选中所有实体,然后点击编辑器&gt;创建NSManagedObject子类,确保选择文件夹并将生成的文件拖放到Model子组和Generated子组中。

这对我有用,它也适合你。

我希望我帮助过你。

答案 4 :(得分:1)

我也碰到了这个bug。我通过删除旧生成的实体子类并再次创建它来修复它,对于组我选择工作区而不是项目中的项目或文件夹,子类保存在项目文件上方。它看起来很奇怪,但它解决了这个问题。此外,如果我将文件移动到项目内的文件夹中,则会再次出现错误。enter image description here

答案 5 :(得分:0)

由于在每次单元测试中都一遍又一遍地重新创建了NSPersistentContainer,因此在单元测试期间遇到了这个问题。看来反复加载相同的受管对象模型可能会导致这种情况。

我的解决方案是在所有单元测试中使用一个共享实例,并在它们之间进行相应的清理。