为什么我可以转换为NSManagedObject而不是我的实体类型?

时间:2014-06-11 03:19:27

标签: ios core-data swift

我正在一个新项目中使用Swift样板代码来处理Core Data。我的.xcdatamodeld文件定义了一个实体(Task),其中包含一个属性(name)。

我有一个Task.swift文件,如下所示:

import CoreData

class Task: NSManagedObject {
    @NSManaged var name: String
}

当我运行它时,它可以工作:

var firstTask = NSEntityDescription.insertNewObjectForEntityForName("Task",
    inManagedObjectContext: managedObjectContext) as NSManagedObject

firstTask.setPrimitiveValue("File my TPS reports", forKey: "name")

var error: NSError?

managedObjectContext.save(&error)

我甚至可以进入iOS模拟器使用的SQLite数据库并确认已添加该行。

但是,当我运行与上面完全相同的代码但使用as Task代替as NSManagedObject时,我收到了与{{1}相关联的错误消息Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)的崩溃} ...线。如果我继续执行,每次推进时,我都会在主题1的顶部获得var firstTaskEXC_BAD_ACCESS

为什么这个演员会导致这一切?

8 个答案:

答案 0 :(得分:46)

确保您的班级名称字段实际上是模块。任务,其中模块是您的应用的名称。 Swift中的CoreData类是命名空间。现在,您的对象被作为NSManagedObject从上下文中拉出,而不是作为任务,因此as-cast失败。

答案 1 :(得分:28)

如果您尝试了以上所有建议而非他们为我工作,这甚至会感到沮丧!!

所以这对我有用。

1-选择您的xcdatamodeld文件

2-确保所有实体在"数据模型中都没有模块 Inspector",如果您看到"型号:当前产品模块" ..清楚它,所以它看起来像附加的图像。

3-删除您的应用以清除核心数据

4-如果仍然无法正常工作,请删除您的实体并重新生成它们。

enter image description here

答案 2 :(得分:12)

您需要修改Task.swift文件。添加@objc(任务),如下所示

import CoreData

@objc(Task)
class Task: NSManagedObject {
    @NSManaged var name: String
}

如果您的项目不包含任何Objective-c代码,我认为这是一个错误。但是,您需要添加该行,直到此修复。

我是从这里学到的。

Youtube video at 11:45

答案 3 :(得分:6)

我想只更改.xcdatamodel中的类字段不再起作用,因为我仍然有以下异常: 致命错误:使用未实现的初始化程序'init(entity:insertIntoManagedObjectContext :)'用于类

所以,我在自定义类中输入了这段代码:

    init(entity: NSEntityDescription!,
    insertIntoManagedObjectContext context: NSManagedObjectContext!) {
        super.init(entity: entity, insertIntoManagedObjectContext: context)
}

突然,它奏效了! NSManagedObject现在可以向下转换为我的自定义类。 我真的不明白为什么这是解决方案,但它有效:)

答案 4 :(得分:5)

@Ben Gottlieb在XCode 7.1和Swift 2.0下的回复更新

  1. 将@objc添加到您的班级。请看Owen Zhao的回答。以下是一个例子:
  2. @objc
    class ImageRecordMO: NSManagedObject{
    
    1. 打开.xcdatamodled文件。

    2. 选择您的实体,然后单击右侧面板上的数据模型检查器。

    3. 输入班级名称,见下图

    4. 选择您的模块为当前产品模块,请参见下图。

    5. enter image description here

答案 5 :(得分:4)

Xcode 7 + Swift 2

Person.swift

@objc(Person)
class Person: NSManagedObject {
}

数据模型

enter image description here

然后只需致电

let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: self.managedObjectContext) as! Person

答案 6 :(得分:2)

我必须添加@objc()和在coredata界面中设置类。 在CoreData右侧窗口的Entity区域中,有Name和Class文本框。 类不能是MSManagedObject,而是您的类。 我创建了一个simple working example

答案 7 :(得分:1)

我在最近几天遇到了这个问题,奇怪的是,对我有用的解决方案是上面建议的变体。

我将@objc声明添加到生成的子类中,但删除了对象模型中类名中的任何名称空间前缀(在生成子类后它具有默认前缀“PRODUCT_MODULE_NAME。”)。这很有用。