检查nil Core Data属性会导致EXC_BAD_ACCESS

Sno*_*man 6 core-data swift

我有一个简单的NSManagedObject子类:

@objc class MyModel: NSManagedObject {
    @NSManaged var myProperty: String
}
Run Code Online (Sandbox Code Playgroud)

但是,以下代码:

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

assert(model != nil) // passes

if model.myProperty != nil { //crashes
    println("not nil")
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 7

为了使它工作,你应该做两件事:

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

@objc class MyModel: NSManagedObject {
    @NSManaged var myProperty: String? // <-- add ? here
}
Run Code Online (Sandbox Code Playgroud)

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

if let aProperty = model.myProperty? {
    // do something with aProperty
}
Run Code Online (Sandbox Code Playgroud)

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


Mun*_*ndi 0

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

if let aProperty = model.myProperty? {
    // do something with aProperty
}
Run Code Online (Sandbox Code Playgroud)