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