为什么我不能叫map <u>(_ transform:(Wrapped)-> U)-> U?并同时使用可选链接?

时间:2018-09-12 07:02:47

标签: swift optional optional-chaining

我知道这样的可选链接:

someOptional?.someProperty

基本上是

someOptional.map { $0.someProperty }

但是,我发现无法同时执行两项操作:

// someOptional?.someProperty evaluates to an optional type, right?
// so the map method should exist!
someOptional?.someProperty.map(someClosure) // can't find "map"

这是MCVE:

let s: String? = "Hello"
s?.hashValue.map(Double.init)

我认为编写上述内容比以下内容更具可读性:

s.map { Double($0.hashValue) }

所以我真的很想同时使用可选链接和map的方法。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

显然,出于某种原因,将第一部分用括号括起来很有效:

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

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

编辑:

以下是Swift reference的相关摘录:

  

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

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