NSNumber类型的托管属性?没有初始化为零

时间:2017-02-14 12:06:22

标签: ios swift core-data optional

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可选属性不同......但我无法在任何地方找到这种行为。

2 个答案:

答案 0 :(得分:2)

我同意Arun你需要选择一种类型(事实上,如果你不这样做,你应该会收到错误)。

至于您的问题,默认情况下,CoreData会为数字字段添加默认值。但是,您可以使用数据模型检查器指示它不设置默认值,如下所示:

Data Model Inspector in Xcode

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

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

答案 1 :(得分:0)

从核心数据.xcmod​​el类中进行选择时,无法选择NSNumber作为数据类型。创建属性时,您可以定义默认值。下面是提到默认值类型的屏幕截图。 因此,如果您希望长度中的值为double,则选择double作为默认值。

从Xcode创建托管类。 Xcode-> Editor->创建NSManagedObject SubClass。您自动生成类。

enter image description here