Ios NSEntityDescription.insertNewObjectForEntityForName不能类型转换为NSManagedObject子类
我的核心数据堆栈中有一个简单的实体(称为日记)。此实体有一个属性(名称) 我使用编辑器生成了NSManagedObject子类。我还确保类名遵循appNameDiaryEntry格式 xcode 7删除“.”并给我一个名为:appNameDiaryEntry 这是我正在使用的代码Ios NSEntityDescription.insertNewObjectForEntityForName不能类型转换为NSManagedObject子类,ios,swift,core-data,Ios,Swift,Core Data,我的核心数据堆栈中有一个简单的实体(称为日记)。此实体有一个属性(名称) 我使用编辑器生成了NSManagedObject子类。我还确保类名遵循appNameDiaryEntry格式 xcode 7删除“.”并给我一个名为:appNameDiaryEntry 这是我正在使用的代码 let diaryEntry : DiaryDiaryEntry diaryEntry = NSEntityDescription.insertNewObjectForEntityForName("DiaryDiar
let diaryEntry : DiaryDiaryEntry
diaryEntry = NSEntityDescription.insertNewObjectForEntityForName("DiaryDiaryEntry", inManagedObjectContext: dataStoreController.managedObjectContext!) as DiaryDiaryEntry
在上面的代码中,DiaryDiaryEntry是从coredata模型创建的NSManagedObject子类
我这样说是错误的
“NSManagedObject”不能转换为“DiaryDiaryEntry”
如果我使用as强制向下投射,它可以工作,但我在运行时收到一个错误(因为该值为零,是强制解包的?)
有没有办法解决这个问题?谢谢,Karthik你肯定得用
来贬低自己但是,当NSEntityDescription.insertNewObjectForEntityForName(…)
返回nil
时,显然还有其他问题。您应该检查实体名称是否正确(必须与数据模型中为实体指定的名称相同)。打开数据模型并选择所需实体时,您可能需要查看数据模型检查器:您必须在class
下指定类的名称,并在Module
下为您的案例选择Current Project Module
,我建议使用相同的实体名称和类名。(更多细节)因此,您应该删除(笨拙的)“DiaryDiaryEntry”,并将其替换为“DiaryEntry” 首先,由于insert..
返回AnyObject
,因此需要强制转换它。使用as有几种方法代码>具有最高的运行时崩溃风险
您还可以将其设置为具有以下内容的警卫:
let entity = NSEntityDescription.insertNewObjectForEntityForName("DiaryDiaryEntry", inManagedObjectContext: dataStoreController.managedObjectContext!) as? DiaryDiaryEntry else { fatalError("Failed to load subclass") }
这仍然会像我写的那样给你一个运行时错误,但它允许你控制事件
至于返回一个nil
,这表示您的模型或代码行中的实体名称中有一个类型。那行代码应该永不返回nil
。我怀疑您的实际实体名称是DiaryEntry
正如Mundi指出的,您的类名有点重复。虽然他喜欢保持类名和模型名相同,但我更喜欢为我的类名添加后缀,这将使您的DiaryEntryMO
在维护代码时非常容易使用。感谢您的帮助。我更改了类名以匹配实体名(以前它不工作,因为xcode抱怨它找不到该类,但我认为在创建NSManaged子类时没有显式指定类名)。。。我仍然得到nil异常,这是因为managedObject上下文为nil。控制器的storeURL(指向MySql.sqlite)在该位置没有显示任何具有该名称(即MySql.sqlite)的内容…?感谢Oliver&Marcus的输入。似乎出于某种原因,我的managedObject上下文为零。请看我上面的评论…有什么想法吗?