核心数据:无法将"MyType_MyType_2"类型的值转换为MyType

Bas*_*ian 27 casting core-data nsmanagedobject swift

我有一个Objective-C模型类MyType.这个类用在Swift代码中:

NSEntityDescription.insertNewObjectForEntityForName("MyType", inManagedObjectContext: context) as! MyType
Run Code Online (Sandbox Code Playgroud)

as!投导致错误信息

Core Data: Could not cast value of type 'MyType_MyType_2' (0x7be99a30) to MyType (0xf33db74).
Run Code Online (Sandbox Code Playgroud)

如果我按照NSManagedObject它的方式投射它.当我打印结果时,我仍然可以看到,它是MyType的实际实例:

<MyType: 0x7ae06d50> (entity: MyType; id: 0x7aeba6d0 <x-coredata:///MyType/t957F2860-85F8-46E0-B6D6-4D1DF6C4EC613> ; data: { 
    ...the fields...
})
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?这个名字MyType_MyType_2来自哪里?

Bou*_*rne 41

当我遇到这个问题时,那是因为我忘了在实体上设置"类".这就是我想出的:

  1. 单击文件结构/项目导航器窗格中的.xcdatamodelId文件(最左侧).
  2. 选择您遇到问题的实体.
  3. 在"工具"窗格(最右侧)中,查找看起来像1997手机的图标,即数据模型检查器.
  4. 在实体设置下,您应该看到两个字段"Name"和"Class" - 使用您正在使用的类的名称设置"Class"(通常与"Name"相同).

在遵循这些步骤之前,您甚至会注意到默认的"类"是NSObject,反映了错误消息.我发现了一些编程方法,但这似乎是最简单/最快的解决方案.

我应该注意我的模型WAS是用Swift编写的,所以我必须添加@zellb提到的@objc(Entity)互操作性参考.但只要您正确地执行该部分,这不应该对解决方案产生影响(这将导致与我的理解不同的无关错误).

  • 对于数据模型检查器,它看起来像Tomagotchi图标. (4认同)

Cod*_*ody 34

  1. 设置实体类名称
  2. 设置模块"当前产品模块"如下所示

在此输入图像描述


waj*_*jih 5

试试这个:

@objc(MyType)
public class MyType: NSManagedObject {
    // your class
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

class MyType: NSManagedObject {
    // your class
}
Run Code Online (Sandbox Code Playgroud)