我怎样才能投到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_ACCESS
和0 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回答更新
- 添加@objc到你的class级。 看到欧文赵的回答。 以下是一个例子:
@objc class ImageRecordMO: NSManagedObject{
-
打开你的.xcdatamodled文件。
-
select您的实体,然后单击右侧面板上的数据模型检查器。
-
inputclass级名称,见下图
-
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。”)。 这工作。