我有一个简单的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 != nil
与EXC_BAD_ACCESS
崩溃。为什么会这样?这仅在Beta 5中开始,并且与Beta 4一起正常运行。
上面的类是使用Xcode自动生成的,因此他们没有在属性的末尾添加?
。但是,手动将?
添加到属性的末尾可以解决问题(@NSManaged var myProperty: String?
)。
我的问题是,为什么Xcode不会自动添加问号以使其成为可选项,如果它在架构中标记为可选,为什么这在以前的测试版中不是问题?
答案 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
}