首页 > 解决方案 > 为什么我不能调用 map (_ transform: (Wrapped) -> U) -> U?并同时使用可选链接?

问题描述

标签: swiftoptionaloptional-chaining

解决方案


显然,出于某种原因,将第一部分括在括号中是有效的:

(s?.hashValue).map(Double.init)

我认为这在某种程度上是由于?优先级较低,或者可选链接与其他表达式的工作方式不同。添加括号可能会导致s?.hashValue成为表达式。

编辑:

以下是Swift 参考的相关摘录:

如果包含可选链接表达式的后缀表达式嵌套在其他后缀表达式中,则只有最外层的表达式返回可选类型。在下面的示例中,当 c 不是 nil 时,它的值被解包并用于评估 .property,其值用于评估 .performAction()。整个表达式 c?.property.performAction() 具有一个可选类型的值。

所以s?.hashValue实际上并不计算为可选类型,因为它嵌套在另一个表达式中。通过添加(),我将其分离为另一个表达式,手动使其评估为可选类型。


推荐阅读