Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSNumber类型的托管属性?未初始化为零_Ios_Swift_Core Data_Optional - Fatal编程技术网

Ios NSNumber类型的托管属性?未初始化为零

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

我的Swift 3应用程序使用CoreData。自从转换到Swift3/Xcode 8以来,我已经放弃了为
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。不确定替代方案;我乐于接受各种想法(在任何地方拆箱都会很麻烦)