我的核心数据堆栈中有一个简单的实体(称为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
答案 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
更容易在维护代码时消耗掉。