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

时间:2016-04-28 18:44:31

标签: ios xcode swift core-data xcode7

在Xcode 7.3中使用带有Swift的Core Data时,我遇到了一个奇怪的错误。

我最近将我们的代码库从Swift 1.0更新到Swift 2.2,现在在尝试访问NSManagedObject扩展的某些元素时出现错误。

我在数据模型中设置了实体(在这里称为Member),如下所示,类名和模块与我在其他帖子中看到的相匹配:

Screenshot of Inspector View of Member Entity

该类本身具有以下最重要的声明:

@objc(会员) class Member:NSManagedObject {

我已经尝试删除并添加顶部的@objc部分,因为我看到人们提到它可能会导致问题。

我通过NSManagedObject扩展中的Convenicnece初始化器实例化我的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”。

谢谢。

1 个答案:

答案 0 :(得分:0)

请勿强行打开从NSEntityDescription.entityForName返回的选项。如果实体没有返回,你可能应该在实体上放一个保护,然后抛出。

顺便说一句,我怀疑这种便利方法只会通过调用NSEntityDescription.insertNewObjectForEntityForName(_:inManagedObjectContext:)来购买任何东西。你还在处理魔术字符串和上下文。