【发布时间】:2017-02-14 12:06:22
【问题描述】:
我的 Swift 3 应用使用 CoreData。自从过渡到 Swift3/Xcode 8 以来,我已经放弃了 NSManagedObject 子类的自动代码生成(新行为,我还没有完全弄清楚),所以我只是指定非/手动并创建自己的类。到目前为止一切顺利。
我将所有标量属性存储在NSNumber? 属性中,而不是可选的标量类型,如Int?、Double? 等(我不确定可选的标量属性是否适用于Core Data...? )。
问题是,我无法检测到新创建的对象中属性的“尚未设置值”状态。
例如,我有:
class MyClass: NSManagedObject {
// Stores a double
@NSManaged var length: NSNumber?
}
每当我尝试访问该值时,我永远不会得到nil,而是0.0:
if let value = myObject.length?.doubleValue {
// Always gets executes and value 0.0 is unwrapped
// for new objects
} else {
// Never gets executed
}
但是,如果我在实例插入时手动将其设置为 nil,即:
override awakeFromInsert(){
super.awakeFromInsert()
// Explicitly set to nil:
self.length = nil
}
...然后,我得到了预期的行为。
我错过了什么吗?
我猜@NSManaged 属性在很多方面都与普通的 swift 可选属性不同......但我在任何地方都找不到这种行为的提及。
【问题讨论】:
-
属性是否可以为空?
-
你是否在 Core Data 模型检查器中为属性定义了一个默认值?
-
哦,是的。即使我使用 NSNumber 手动生成代码,“使用标量类型”的复选框也被选中,默认值设置为零! :0
-
愚蠢的我。我想就是这样。我确实也选中了“可选”框...
-
这是 Swift:默认值为零! :0 !=
nil(无值)。
标签: ios swift core-data optional