ios - NSNumber 类型的托管属性?没有初始化为 nil

标签 ios swift core-data option-type

我的 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 会为数字字段添加默认值。但是,您可以使用数据模型检查器指示它不设置默认值,如下所示:

Data Model Inspector in Xcode

如果您在创建新记录时确实关闭了默认设置并将该字段留空,请确保也选中了可选复选框(它位于默认复选框上方几行)。

此外,如果您在第一次部署后添加没有默认值的必填字段,您将需要自己处理迁移,因为在向现有数据库添加新的必填字段时轻型迁移依赖于默认值。

关于ios - NSNumber 类型的托管属性?没有初始化为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42225749/

相关文章:

iphone - View Controller - 来自文档的建议

ios - 如何以编程方式更改 UITableVeiw 的披露指示器的颜色?

ios - 如何更新 mapView 上 MKAnnotation 对象的位置?

ios - 使用 SecKeyGeneratePair 在 iOS 中生成 key 对失败并显示 errSecInteractionNotAllowed

ios - 核心数据 + 'statement is still active'

iphone - Core Data性能deleteObject并保存托管对象上下文

iphone - 将图像添加到ios中的“事件”指示器中

ios - 如何使 Sprite 工具包对象不受重力影响?

ios - 如何在 Algolia 中同时即时搜索多个索引? swift

ios - 多个获取请求导致应用程序卡住