在Xcode 7.3中使用Swift实例化核心数据托管对象



在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:)更大的好处。你仍然在处理一根神奇的绳子和上下文。

最新更新