在Xcode 7.3中将Core Data与Swift一起使用时,我遇到了一个奇怪的错误。
我最近将我们的代码库从Swift 1.0更新到Swift 2.2,现在在尝试访问NSManagedObject扩展的某些元素时遇到了一个错误。
我在数据模型中设置了实体(这里称为Member),如下所示,类名和模块与我在其他帖子中看到的相匹配:
成员实体的检查员视图屏幕截图
类本身有以下最上面的声明:
@objc(成员)类成员:NSManagedObject{
我试着删除和添加顶部的@objc部分,因为我看到人们提到这可能会导致问题。
我通过NSManagedObject扩展中的一个常规初始化器实例化了我的NSManagedObjects的一个实例,如下所示:
convenience init(context: NSManagedObjectContext, className: String) {
let entity = NSEntityDescription.entityForName(className, inManagedObjectContext: context)
self.init(entity: entity!, insertIntoManagedObjectContext: context)
}
最后,当我尝试在Member对象上设置某些属性时,会出现错误。我认为这可能与属性是否可选有关,但切换这些属性似乎没有效果。
我得到的错误是EXEC_BAD_ACCESS错误,但它似乎源于当我实例化Member对象时打印出来的以下内容:
MyAppName[23325:891360] CoreData: warning: Unable to load class named
'MyAppName.Optional("Member")' for entity 'Member'. Class not found,
using default NSManagedObject instead.
如果有任何见解,我将不胜感激,因为我不确定还能尝试什么,也不确定为什么要在类名的开头添加".Optional"。
谢谢。
不要强行打开从NSEntityDescription.entityForName
返回的可选项。您可能应该在实体上放置一个guard-let,如果实体没有返回则抛出。
顺便说一句,我怀疑这种方便的方法能为您带来比调用NSEntityDescription.insertNewObjectForEntityForName(_:inManagedObjectContext:)
更大的好处。你仍然在处理一根神奇的绳子和上下文。