我的 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 可选属性......但我无法在任何地方找到这种行为的提及.
最佳答案
我同意 Arun 的观点,您需要选择一个类型(事实上,如果不选择,您应该会收到错误消息)。
关于您的问题,默认情况下 CoreData 会为数字字段添加默认值。但是,您可以使用数据模型检查器指示它不设置默认值,如下所示:
如果您在创建新记录时确实关闭了默认设置并将该字段留空,请确保也选中了可选复选框(它位于默认复选框上方几行)。
此外,如果您在第一次部署后添加没有默认值的必填字段,您将需要自己处理迁移,因为在向现有数据库添加新的必填字段时轻型迁移依赖于默认值。
关于ios - NSNumber 类型的托管属性?没有初始化为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42225749/