如何在Swift中表示Core Data可选标量(Bool/Int/Double/Float)?

Nik*_*iev 33 xcode core-data ios swift

(首先注意到:Xcode 8.2.1,iOS 10,Swift 3)(仍然存在:Xcode 9 beta 3,iOS11,Swift 4)

我们都知道先行的Core Data概念optionals并没有严格地与Swift概念联系在一起optionals.

我们已经接受了即使Core Data属性被标记为Non-optional,自动生成的NSManagedObject子类也有一个optional类型:

(有些人手动删除?没有任何不利影响,有些人没有,但这是不重要的)

(从这里的例子和截图是Bool性能,但同样适用于Int16/32/64,Double,Float)

现在我注意到了相反的情况 - 当Core Data类型的属性Bool被标记为Optional(并且Use Scalar Type被选择,Xcode默认执行)时,自动生成的类具有non-optional类型的变量.

这有意义吗?这是一个错误吗?行为记录在任何地方吗?

最重要的是 - 我如何实际代表一个可选项Bool

我可以想到一些解决方法,但它们似乎并不理想(例如,不使用标量,而是回到NSNumber表示Bool.或者(甚至更糟)有一个单独Bool调用的东西isVerified_isSet)


注意:我做了几个测试,如果Default Value设置为NoneNO,则变量保存为false(即使我从未在我的代码中实际分配它).如果Default Value设置为YES,则变量将保存为true.尽管如此,这意味着(显然)没有办法在逻辑上将此变量表示为尚未设置.

Tom*_*ton 20

我看到同样的事情,我认为这是一个错误.我没有找到任何可以找到的文件.显然Core Data正在应用Objective-C样式假设,其中布尔值默认为NO,并且整数默认为0.核心数据/ Swift接口有一些粗糙的边缘,这是我以前没有考虑过的.

这是一个很好的发现,但我认为你坚持使用它,直到Apple解决它.你已经知道最好的解决方法,我同意这不是很好.我建议提交一个bug.

  • 许多 Apple 框架的底层都是 ObjC,但如果支持 Swift 与它们一起使用,它们应该呈现 Swifty 接口。 (2认同)

Saú*_*ril 10

我宁愿使用 Objective-C 类型来管理这些情况,而不是 Swift 类型。在这些情况下,对于标量类型,您可以使用 NSNumber。

 @NSManaged public var myDouble: NSNumber?
Run Code Online (Sandbox Code Playgroud)

在模型中 myDouble 是一个可选的 double,默认情况下值为 nil。

要获得真正的价值,您只需要使用:

myEntity.myDouble?.doubleValue
Run Code Online (Sandbox Code Playgroud)

  • 问题是如何表示可选标量值,因此使用可选 NSNumber 是一个有效的解决方案。 (2认同)

Are*_*rek 9

这是因为Objective-C标量类型没有nil值的概念.来源:handling-core-data-optional-scalar-attributes