Swift核心数据:设置可选属性值时为啥需要解包?
Posted
技术标签:
【中文标题】Swift核心数据:设置可选属性值时为啥需要解包?【英文标题】:Swift core data: why do I need to unwrap when setting optional attribute values?Swift核心数据:设置可选属性值时为什么需要解包? 【发布时间】:2020-06-04 15:13:42 【问题描述】:我有一个主要包含可选属性的核心数据模型。然后我假设我不需要解开分配给这些可选属性的值。例如我以为我能做到:
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">
【问题讨论】:
你所描述的应该是真的。我怀疑myEntity
或currentOrder
的定义并不像您认为的那样。您应该在代码中显示这些的确切定义。
谢谢@RobNapier 我刚刚添加了一个可选属性的定义以及它所属的实体......
【参考方案1】:
您似乎对“可选”一词含糊其辞。
属性描述 optional="YES"
中的“可选”一词与 Swift Optional 枚举类型不同,也没有任何关系。
前者只是普通的英文单词“optional”,意思是“not required”——对于一个特定的实体,这个属性可能有也可能没有一个值,即Float
,但即使有't,它是一个有效的实体。故事中没有说这个属性的 type 是Optional<Float>
。它的类型是Float
。而且您不能在预期其包装类型的地方分配 Swift Optional;你必须打开它。
确实,documentation 非常明确地指出了这一点:
可选属性在保存到持久存储时不需要具有值。默认情况下,属性是可选的。 Core Data 可选项与 Swift 可选项不同。 [我的斜体。]
【讨论】:
感谢您的回复 - 所以在这种情况下,没有办法避免打开这些包装?我面临的这个问题是我有一个相当长的属性列表(总共大约 70 个),看来我需要单独打开每个属性 我不知道为什么currentOrder.gravity
是可选的,因为你没有告诉我。也许需要,也许不需要;我无法知道,这也不是你问题的一部分。也许您想就构建类型提出不同的问题?同时,您确实问的是为什么不能将Optional<Float>
直接分配给myEntity.gravity
,我想我已经回答了。
很公平,理解以上是关于Swift核心数据:设置可选属性值时为啥需要解包?的主要内容,如果未能解决你的问题,请参考以下文章
tableview reloadData在解包可选值时崩溃意外发现的nil
使用 Core Data 解包 Optional 值时意外发现 nil