Swift 核心数据:设置可选属性值时为什么需要解包?

Swift core data: why do I need to unwrap when setting optional attribute values?

我有一个主要包含可选属性的核心数据模型。当时我假设我不需要解包我分配给这些可选属性的值。例如我以为我能做到:

myEntity.gravity = currentOrder.gravity

(myEntity.gravity 可选)

但是,Swift 仍然需要我解包 currentOrder.gravity。我本以为我分配给的变量是可选的,我不需要打开它。

更新:

这是我正在描述的核心数据实体之一的定义:

    <attribute name="percentComplete" optional="YES" attributeType="Float" defaultValueString="0.0" usesScalarValueType="YES"/>

实体本身:

    <entity name="AircraftMeasurementsCD" representedClassName="AircraftMeasurementsCD" syncable="YES" codeGenerationType="class">

您似乎对 "optional" 这个词含糊不清。 属性描述 optional="YES" 中的单词 "optional" 与 Swift 可选枚举类型不同,也没有任何关系。

前者只是普通的英文单词"optional",意思是"not required"——对于一个特定的实体,这个属性可能有也可能没有值,即Float,但即使没有,它也是一个有效的实体。故事中没有任何内容表明此属性的 类型 Optional<Float>。它的类型是 Float。而且您不能在预期其包装类型的地方分配 Swift Optional;你必须打开它。

的确,documentation:

非常明确地表达了这一点

Optional attributes aren’t required to have a value when saved to the persistent store. Attributes are optional by default. Core Data optionals aren’t the same as Swift optionals. [My italics.]