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

时间:2017-03-06 10:03:06

标签: ios swift xcode core-data

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

我们都知道Core Data的{​​{1}}概念优先于optionals Swift的{​​{1}}概念。

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

(有些人手动移除optional没有任何不利影响,有些人没有,但这不是重点)

(此处的示例和截图适用于?属性,但同样适用于BoolInt16/32/64Double

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

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

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

我可以想到一些解决方法,但它们似乎并不理想(例如,不使用标量,而是回到Bool的{​​{1}}表示。或者(甚至更糟)有一个单独的NSNumber称为Bool

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

4 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:0)

如果您最终在这里:

@NSManaged var boolAttribute: Bool

并且在Objective-C,中没有出现,您已经在这些属性上禁用了“可选”并启用了“使用标量类型”,然后帮自己一个忙。

仔细检查您是否已将Swift桥接标头导入到该Objective-C文件中。

我没有,好吧,我是在将自己的Bools换成NSNumbers之前的绝大部分方法,然后才sm然大悟并意识到自己曾经多么愚蠢。

答案 3 :(得分:0)

我可以使用Objective-C类型来管理这些情况。 在这些情况下,对于标量类型,可以使用NSNumber。

 @NSManaged public var myDouble: NSNumber?

在模型中,myDouble是默认为nil值的可选double。

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

myEntity.myDouble?.doubleValue