(首先注意到: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
没有任何不利影响,有些人没有,但这不是重点)
(此处的示例和截图适用于?
属性,但同样适用于Bool
,Int16/32/64
,Double
)
现在我注意到相反的情况 - 当Float
类型的Core Data
属性标记为Bool
(并且选择了Optional
时,默认情况下Xcode会执行此操作),自动生成的类具有Use Scalar Type
类型的变量。
这有意义吗?这是一个错误吗?行为是否记录在任何地方?
最重要的是 - 我如何实际代表一个可选的non-optional
?
我可以想到一些解决方法,但它们似乎并不理想(例如,不使用标量,而是回到Bool
的{{1}}表示。或者(甚至更糟)有一个单独的NSNumber
称为Bool
)
注意:我做了几次测试,如果Bool
设置为isVerified_isSet
或Default Value
,则变量会保存为None
(即使我从来没有在我的代码中实际分配它)。如果NO
设置为false
,则变量将保存为Default Value
。尽管如此,这意味着(显然)没有办法在逻辑上将此变量表示为尚未设置。
答案 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