Ios NSNumber类型的托管属性?未初始化为零
我的Swift 3应用程序使用CoreData。自从转换到Swift3/Xcode 8以来,我已经放弃了为Ios NSNumber类型的托管属性?未初始化为零,ios,swift,core-data,optional,Ios,Swift,Core Data,Optional,我的Swift 3应用程序使用CoreData。自从转换到Swift3/Xcode 8以来,我已经放弃了为NSManagedObject子类自动生成代码(新的行为,我还没有完全弄清楚),所以我只指定了non/manual并创建了自己的类。到目前为止还不错 我将所有标量属性存储在NSNumber?属性中,而不是可选的标量类型,如Int?、Double?等(我不确定可选标量属性是否与核心数据配合良好…?) 问题是,我无法在新创建的对象中检测属性的“值尚未设置”状态 例如,我有: class MyCl
NSManagedObject
子类自动生成代码(新的行为,我还没有完全弄清楚),所以我只指定了non/manual并创建了自己的类。到目前为止还不错
我将所有标量属性存储在NSNumber?
属性中,而不是可选的标量类型,如Int?
、Double?
等(我不确定可选标量属性是否与核心数据配合良好…?)
问题是,我无法在新创建的对象中检测属性的“值尚未设置”状态
例如,我有:
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可选属性。。。但是我在任何地方都找不到这种行为。在从core data.xcmodel类中选择时,不能选择NSNumber作为数据类型。创建属性时,定义一个默认值。下面是提到默认值类型的屏幕截图。
因此,如果希望长度中的值为double,请选择double作为默认值
从Xcode创建托管类。Xcode->Editor->创建NSManagedObject子类。您可以自动生成类
从core data.xcmodel类中选择时,不能选择NSNumber作为数据类型。创建属性时,定义一个默认值。下面是提到默认值类型的屏幕截图。 因此,如果希望长度中的值为double,请选择double作为默认值 从Xcode创建托管类。Xcode->Editor->创建NSManagedObject子类。您可以自动生成类
我同意Arun的观点,即您需要选择一种类型(事实上,如果不选择,您应该会收到一个错误) 至于您的问题,默认情况下,CoreData会为数字字段添加默认值。但是,您可以使用数据模型检查器指示它不设置默认值,如下所示: 如果在创建新记录时确实关闭了默认设置并将字段留空,请确保选中了可选复选框(位于默认复选框上方几行)
另外,如果您在第一次部署后添加了不带默认值的必填字段,则需要自己处理迁移,因为在向现有数据库添加新的必填字段时,轻度迁移依赖于默认值。我同意Arun的说法,即您需要选择一种类型(事实上,如果不选择,则会出现错误) 至于您的问题,默认情况下,CoreData会为数字字段添加默认值。但是,您可以使用数据模型检查器指示它不设置默认值,如下所示: 如果在创建新记录时确实关闭了默认设置并将字段留空,请确保选中了可选复选框(位于默认复选框上方几行)
此外,如果在第一次部署后添加了不带默认值的必填字段,则需要自己处理迁移,因为向现有数据库添加新的必填字段时,轻度迁移依赖于默认值。属性是否可以为null?是否在核心数据模型检查器中为属性定义了默认值?哦,是的。即使我使用NSNumber手动生成代码,也会选中“使用标量类型”复选框,默认值设置为零!:我真傻。我想就是这样。我也勾选了“可选”框,不过…这是Swift:默认值零!:0 !=
nil
(无值)。属性是否可以为null?是否在核心数据模型检查器中为属性定义了默认值?哦,是的。即使我使用NSNumber手动生成代码,也会选中“使用标量类型”复选框,默认值设置为零!:我真傻。我想就是这样。我也勾选了“可选”框,不过…这是Swift:默认值零!:0 != nil
(无值)。我正在选择一种类型(Integer16、Double等)。我只是在我的类定义中使用NSNumber。不确定替代方案;我乐于接受各种想法(在任何地方拆开NSNumber都会很麻烦),我正在选择一种类型(Integer16、Double等)。我只是在我的类定义中使用NSNumber。不确定替代方案;我乐于接受各种想法(在任何地方拆箱都会很麻烦)