2017-03-06 71 views
8

(第一次注意到上:Xcode的8.2.1,iOS装置10,夫特3) (仍然存在的:Xcode的9测试版3,iOS11,夫特4)如何在Swift中表示Core Data可选的标量(Bool/Int/Double/Float)?

大家都知道的optionals先于Core Data概念和并不严格依据optionalsSwift概念。

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

(有些人没有不良影响手动删除?,一些别“吨,但这是题外话)

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

现在我注意到相反 - 时为Optional(和Use Scalar Type被选择,其确实的Xcode默认情况下)被标记Bool类型的Core Data属性,自动生成的类有一个non-optional类型的变量。

这是否有道理?这是一个错误吗?行为是否记录在任何地方?

而且最重要的是 - 我该如何代表可选的Bool

我能想到一些变通的,但他们似乎并不理想(例如,不使用标量,但要回BoolNSNumber表示。或(更糟糕),具有独立的Bool称为像isVerified_isSet


注:我做了一对夫妇更多的测试,如果Default Value设置为NoneNO,那么变量被保存为false(即使我从来没有真正在我的代码为它分配)。如果Default Value设置为YES,则该变量将被保存为true。尽管如此,这意味着(显然)没有办法从逻辑上将这个变量表示为尚未设置。

回答

5

我看到同样的事情,我认为它是一个错误。它没有记录在我能找到的任何地方。显然Core Data在这里应用了Objective-C风格的假设,其中布尔默认为NO,整数默认为0. Core Data/Swift接口有一些粗糙的边缘,这是我之前没有考虑过的。

这是一个很好的发现,但我认为你一直坚持下去,直到苹果解决它。你已经知道最好的解决方法,我同意这不是很好。我建议提交一个错误。

+0

感谢您的回答。实际上,除非你提到它,否则我甚至都没有意识到所有标量类型都会发生同样的“问题”,而不仅仅是“Bool”。(我现在修改了原来的问题来提一提)。 –

相关问题