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">

【问题讨论】:

你所描述的应该是真的。我怀疑myEntitycurrentOrder 的定义并不像您认为的那样。您应该在代码中显示这些的确切定义。 谢谢@RobNapier 我刚刚添加了一个可选属性的定义以及它所属的实体...... 【参考方案1】:

您似乎对“可选”一词含糊其辞。 属性描述 optional="YES" 中的“可选”一词与 Swift Optional 枚举类型不同,也没有任何关系。

前者只是普通的英文单词“optional”,意思是“not required”——对于一个特定的实体,这个属性可能有也可能没有一个值,即Float,但即使有't,它是一个有效的实体。故事中没有说这个属性的 typeOptional&lt;Float&gt;。它的类型是Float。而且您不能在预期其包装类型的地方分配 Swift Optional;你必须打开它。

确实,documentation 非常明确地指出了这一点:

可选属性在保存到持久存储时不需要具有值。默认情况下,属性是可选的。 Core Data 可选项与 Swift 可选项不同。 [我的斜体。]

【讨论】:

感谢您的回复 - 所以在这种情况下,没有办法避免打开这些包装?我面临的这个问题是我有一个相当长的属性列表(总共大约 70 个),看来我需要单独打开每个属性 我不知道为什么currentOrder.gravity 是可选的,因为你没有告诉我。也许需要,也许不需要;我无法知道,这也不是你问题的一部分。也许您想就构建类型提出不同的问题?同时,您确实问的是为什么不能将Optional&lt;Float&gt; 直接分配给myEntity.gravity,我想我已经回答了。 很公平,理解

以上是关于Swift核心数据:设置可选属性值时为啥需要解包?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 可选绑定,为啥需要本地 var?

tableview reloadData在解包可选值时崩溃意外发现的nil

使用 Core Data 解包 Optional 值时意外发现 nil

Alamofire URL 请求 - 解包可选值时意外发现 nil

为啥我在我的 Swift 文件中解包 nil?

致命错误:在展开可选值时意外发现 nil - 为啥?