我在一个新项目中将Swift样板代码用于Core Data。我的.xcdatamodeld文件有一个定义的单一实体(Task)和一个属性(name)。
.xcdatamodeld
Task
name
我有一个Task.swift看起来像这样的文件:
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_位于线程1的顶部。
as Task
as NSManagedObject
Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
var firstTask
EXC_BAD_ACCESS
0 misaligned_stack_error_
为什么这种转换会导致所有这些?
确保您的“类名”字段实际上是 Module .Task,其中 Module 是您的应用程序的名称。Swift中的CoreData类具有名称空间。现在,您的对象是作为NSManagedObject而不是Task移出上下文的,因此铸态失败了。