我怎样才能投到NSManagedObject但不是我的实体的types?

我在一个新项目中使用了Core Data的Swift样板代码。 我的.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 ,我得到一个崩溃与错误消息Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) ,与var firstTask …行。 如果继续执行,每当我提前执行时,就会在线程1的顶部获得EXC_BAD_ACCESS0 misaligned_stack_error_

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

确保您的类名字段实际上是Module .Task,其中Module是您的应用程序的名称。 Swift中的CoreData类是命名空间的。 现在,你的对象被作为一个NSManagedObject而不是作为一个任务,从而脱离了上下文,所以as-cast失败了。

如果你尝试了以上所有的build议,而且这些build议不是为我工作的话,这甚至是令人沮丧的!

所以这是对我有用的东西。

1-select您的xcdatamodeld文件

2-确保所有实体在“数据模型检查器”中都没有模块,如果您看到“模型:当前产品模块”..清除它,它看起来像附加的图像。

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

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

在这里输入图像说明

你需要修改你的Task.swift文件。 像下面添加@objc(任务)

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

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

我从这里学到了

在11:45的Youtubevideo

我猜只是改变.xcdatamodel中的类字段不再工作,因为我仍然有以下exception:致命错误:使用未实现的初始化'init(entity:insertIntoManagedObjectContext :)'的类

所以,我在我的自定义类中input了这个代码:

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

突然,它的工作! NSManagedObject现在可以下载到我的自定义类。 我真的不明白为什么这是解决scheme,但它的工作:)

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

  1. 添加@objc到你的class级。 看到欧文赵的回答。 以下是一个例子:
 @objc class ImageRecordMO: NSManagedObject{ 
  1. 打开你的.xcdatamodled文件。

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

  3. inputclass级名称,见下图

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

在这里输入图像说明

Xcode 7 + Swift 2

Person.swift

 @objc(Person) class Person: NSManagedObject { } 

数据模型

在这里输入图像说明

然后只需打电话

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

我不得不添加@objc()并在coredata接口中设置类 。 在CoreData右侧窗口的Entity区域中,有Name和Class文本框。 类不能是MSManagedObject,而是你的类 。 我创build了一个简单的工作示例 !

在过去的几天里,我遇到了这个问题,奇怪的是,对我来说,解决scheme是上面提到的一个变种。

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