2017-02-14 54 views
0

我的Swift 3应用程序使用CoreData。自从转换到Swift3/Xcode 8以来,我已经放弃了NSManagedObject子类的自动代码生成(新行为,我还没有完全想到它),所以我只是指定非/手动并创建我自己的类。到现在为止还挺好。NSNumber类型的托管属性?未初始化为零

我存储我所有的标量在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 
} 

但是,如果我手动设置无实例插入,即:

override awakeFromInsert(){ 

    super.awakeFromInsert() 

    // Explicitly set to nil: 
    self.length = nil 
} 

...然后,我得到预期的行为。

我错过了什么吗?

我在猜测@NSManaged属性使它在许多方面不同于普通的快速可选属性......但我无法在任何地方找到这种行为。

+1

属性可以为空? – Sulthan

+2

您是否为核心数据模型检查器中的属性定义了*默认值*? –

+0

哦,是的。即使我使用NSNumber手动生成代码,选中“使用标量类型”复选框并将默认值设置为零! :0 –

回答

2

我与阿伦同意,你需要选择一个类型(其实,你应该得到一个错误,如果你不这样做)。

至于你的问题,CoreData默认为数字字段添加默认值。不过你可以指挥它不使用数据模型检查器中设置的默认值,如下图所示:

Data Model Inspector in Xcode

如果关闭默认并保留字段为空当您创建一个新的记录,确保可选复选框也被选中(这是默认复选框上方的几行)。另外,如果您在第一次部署后添加了没有默认值的必填字段,您将需要自己处理迁移,因为在向现有数据库添加新的必填字段时,轻量迁移依赖于默认值。

+0

我*选择一个类型(Integer16,Double等)。我只是在我的类定义中使用NSNumber。不清楚替代方案;我开放的想法(拆箱NSNumber到处都变得繁琐) –

0

从核心数据.xcmod​​el类中进行选择时,不能选择NSNumber作为数据类型。当你创建属性时,你可以定义一个默认值。下面是提到默认值类型的截图。 所以,如果你想在长度的值作为双重选择双重作为默认值。

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

enter image description here