NSEntityDescription.insertNewObjectForEntityForName不能强制转换为NSManagedObject子类

时间:2016-01-03 20:25:12

标签: ios swift core-data

我的核心数据堆栈中有一个简单的实体(称为Diary)。该实体有一个属性(名称)

我使用编辑器生成了NSManagedObject子类。我还确保课程名称遵循 appName DiaryEntry 格式

xcode 7删除“。”并给我一个名为 appNameDiaryEntry

的课程

这是我正在使用的代码

let diaryEntry : DiaryDiaryEntry

diaryEntry = NSEntityDescription.insertNewObjectForEntityForName("DiaryDiaryEntry", inManagedObjectContext: dataStoreController.managedObjectContext!) as DiaryDiaryEntry

在上面的代码中, DiaryDiaryEntry 是从coredata模型创建的NSManagedObject子类。

我收到错误说

  

'NSManagedObject'无法转换为'DiaryDiaryEntry'

如果我强制使用 as!进行向下转换,它可以正常工作,但我在运行时遇到错误(因为该值为nil并且强制解压缩?)

任何想法如何解决这个问题?谢谢,Karthik

3 个答案:

答案 0 :(得分:0)

你当然必须使用as!向下转发但是当NSEntityDescription.insertNewObjectForEntityForName(...)返回nil时,还有其他一些明显错误的地方。您应该检查您的实体名称是否正确(必须与数据模型中为实体指定的名称相同)。在打开数据模型并选择所需实体时,您可能需要查看数据模型检查器:您必须在Class下指定类的名称,然后在{{1}下选择Current Project Module }。

答案 1 :(得分:0)

对于您的情况,我建议使用相同的实体名称和类名。 (更多细节here。)因此,你应该消除(笨拙的)“DiaryDiaryEntry”,并将其替换为“DiaryEntry”。

答案 2 :(得分:0)

首先,由于insert..返回AnyObject,您需要投射它。有几种方法可以使as!具有最高的运行时崩溃风险。

您还可以将其设置为具有以下内容的警卫:

let entity = NSEntityDescription.insertNewObjectForEntityForName("DiaryDiaryEntry", inManagedObjectContext: dataStoreController.managedObjectContext!) as? DiaryDiaryEntry else { fatalError("Failed to load subclass") }

这仍然会像我写的那样给你一个运行时错误,但它允许你控制事件。

至于获得nil,这表示您在模型或代码行中的实体名称中有类型。该行代码应该永远不会返回nil。我怀疑您的实际实体名称是DiaryEntry

正如Mundi指出的那样,你的班级名称有点重复。虽然他喜欢保持类和模型名称相同,但我更喜欢使用我的类名称后缀,这会使你的DiaryEntryMO更容易在维护代码时消耗掉。