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

Wil*_*itt 35 core-data ios swift

我正在一个新项目中使用Swift样板代码来处理Core Data.我的.xcdatamodeld文件有一个实体defined(Task),有一个属性(name).

我有一个Task.swift看起来像这样的文件:

import CoreData

class Task: NSManagedObject {
    @NSManaged var name: String
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它的工作原理:

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

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

var error: NSError?

managedObjectContext.save(&error)
Run Code Online (Sandbox Code Playgroud)

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

但是,当我运行与上面完全相同的代码但是,as Task而不是as NSManagedObject,我得到一个崩溃与错误消息Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0),与var firstTask...线相关联.如果我继续执行,我得到EXC_BAD_ACCESS0 misaligned_stack_error_在每一次我提前就螺纹1的顶部.

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

Ben*_*ieb 46

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

  • 在我看来,这个解决方案不再适用于XCode 7 beta 2:XCode 7 beta 2的实体检查器从`AppName.Task` - >`AppNameTask`中删除了点.(我使用XCode 6.x成功使用了此解决方案) (5认同)
  • 没关系.现在就搞定了.您的建议加上SiLo的要求帮助我解决了这一切.我需要在Core Data模型实体检查器的Class字段中使用`AppName.Task`. (4认同)

pol*_*war 28

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

所以这对我有用.

1-选择您的xcdatamodeld文件

2-如果您看到"型号:当前产品模块",请确保所有实体在"数据模型检查器"中都没有模块.明确它,使其看起来像附加图像.

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

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

在此输入图像描述


Owe*_*hao 12

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

import CoreData

@objc(Task)
class Task: NSManagedObject {
    @NSManaged var name: String
}
Run Code Online (Sandbox Code Playgroud)

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

我是从这里学到的.

Youtube视频于11:45


Jov*_*ski 6

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

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

    init(entity: NSEntityDescription!,
    insertIntoManagedObjectContext context: NSManagedObjectContext!) {
        super.init(entity: entity, insertIntoManagedObjectContext: context)
}
Run Code Online (Sandbox Code Playgroud)

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


Ans*_*Yao 5

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

  1. 将@objc添加到您的班级.见Owen Zhao的回答.以下是一个例子:
@objc
class ImageRecordMO: NSManagedObject{
Run Code Online (Sandbox Code Playgroud)
  1. 打开.xcdatamodled文件.

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

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

  4. 选择您的模块为Current Product Module,请参见下图.

在此输入图像描述