我正在一个新项目中使用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 firstTask
和EXC_BAD_ACCESS
。
为什么这个演员会导致这一切?
答案 0 :(得分:46)
确保您的班级名称字段实际上是模块。任务,其中模块是您的应用的名称。 Swift中的CoreData类是命名空间。现在,您的对象被作为NSManagedObject从上下文中拉出,而不是作为任务,因此as-cast失败。
答案 1 :(得分:28)
如果您尝试了以上所有建议而非他们为我工作,这甚至会感到沮丧!!
所以这对我有用。
1-选择您的xcdatamodeld文件
2-确保所有实体在"数据模型中都没有模块 Inspector",如果您看到"型号:当前产品模块" ..清楚它,所以它看起来像附加的图像。
3-删除您的应用以清除核心数据
4-如果仍然无法正常工作,请删除您的实体并重新生成它们。
答案 2 :(得分:12)
您需要修改Task.swift文件。添加@objc(任务),如下所示
import CoreData
@objc(Task)
class Task: NSManagedObject {
@NSManaged var name: String
}
如果您的项目不包含任何Objective-c代码,我认为这是一个错误。但是,您需要添加该行,直到此修复。
我是从这里学到的。
答案 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下的回复更新
答案 5 :(得分:4)
Xcode 7 + Swift 2
Person.swift
@objc(Person)
class Person: NSManagedObject {
}
数据模型
然后只需致电
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。”)。这很有用。