My Swift 3应用使用CoreData。自从转换到Swift3 / Xcode 8后,我放弃了NSManagedObject
子类的自动代码生成(新的行为,我还没有完全弄明白),所以我只指定non / manual并创建我自己的类。到目前为止一切都很好。
我将所有标量属性存储在NSNumber?
属性中,而不是Int?
,Double?
等可选标量类型(我不确定可选的标量属性是否适用于核心数据......?)。
问题是,我无法在新创建的对象中检测到属性的“Value not Yet Set”状态。
例如,我有:
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可选属性不同......但我无法在任何地方找到这种行为。
答案 0 :(得分:2)
我同意Arun你需要选择一种类型(事实上,如果你不这样做,你应该会收到错误)。
至于您的问题,默认情况下,CoreData会为数字字段添加默认值。但是,您可以使用数据模型检查器指示它不设置默认值,如下所示:
如果您确实关闭了默认设置并在创建新记录时将该字段留空,请确保同时选中了可选复选框(它在默认复选框上方几行)。
此外,如果在首次部署后添加没有默认值的必填字段,则需要自行处理迁移,因为轻量迁移在向现有数据库添加新的必填字段时依赖于默认值。
答案 1 :(得分:0)