检查nil Core Data属性会导致EXC_BAD_ACCESS

时间:2014-08-05 14:42:14

标签: core-data swift

我有一个简单的NSManagedObject子类:

@objc class MyModel: NSManagedObject {
    @NSManaged var myProperty: String
}

但是,以下代码:

var model = NSEntityDescription.insertNewObjectForEntityForName("MyModel", inManagedObjectContext: managedObjectContext) as MyModel

assert(model != nil) // passes

if model.myProperty != nil { //crashes
    println("not nil")
}

if model.myProperty != nilEXC_BAD_ACCESS崩溃。为什么会这样?这仅在Beta 5中开始,并且与Beta 4一起正常运行。

上面的类是使用Xcode自动生成的,因此他们没有在属性的末尾添加?。但是,手动将?添加到属性的末尾可以解决问题(@NSManaged var myProperty: String?)。

我的问题是,为什么Xcode不会自动添加问号以使其成为可选项,如果它在架构中标记为可选,为什么这在以前的测试版中不是问题?

2 个答案:

答案 0 :(得分:7)

为了使它成功,你应该做两件事:

1)在NSManagedObject子类中添加?使属性可选

@objc class MyModel: NSManagedObject {
    @NSManaged var myProperty: String? // <-- add ? here
}

2)在您的实施中,如上一个答案中所建议的那样

if let aProperty = model.myProperty? {
    // do something with aProperty
}

请注意,如果您忘记添加?在NSManagedObject子类中,我们有编译错误。

答案 1 :(得分:0)

实际上,Apple在其 Swift编程语言指南中建议的模式是

if let aProperty = model.myProperty? {
    // do something with aProperty
}