我知道这样的可选链接:
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
的方法。
我该怎么做?
答案 0 :(得分:1)
显然,出于某种原因,将第一部分用括号括起来很有效:
(s?.hashValue).map(Double.init)
我认为这是由于?
的优先级较低,或者可选的链与其他表达式的工作方式不同。添加括号可能导致s?.hashValue
成为表达式。
编辑:
以下是Swift reference的相关摘录:
如果后缀表达式包含可选链接表达式 嵌套在其他postfix表达式内,仅最外层 表达式返回一个可选类型。在下面的示例中,当c为 不是nil,则将其值解包并用于评估.property, 其值用于评估.performAction()。整个 表达式c?.property.performAction()的值是可选的 类型。
因此s?.hashValue
实际上不会求值为可选类型,因为它嵌套在另一个表达式中。通过添加()
,我将其分离为另一个表达式,并手动将其评估为可选类型。