Swift 为什么可以';我称之为地图<;U>;(U-transform:(Wrapped)->;U)->;U同时使用可选链接?

Swift 为什么可以';我称之为地图<;U>;(U-transform:(Wrapped)->;U)->;U同时使用可选链接?,swift,optional,optional-chaining,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) /

我知道这样的可选链接:

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


我该怎么做?

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

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

编辑:

以下是该报告的相关摘录:

如果是包含可选链接表达式的后缀表达式 嵌套在其他后缀表达式中,仅最外层 表达式返回一个可选类型。在下面的示例中,当c是 不是nil,它的值被展开并用于求值 其值用于计算.performAction()。整个 表达式c?.property.performAction()的值为可选值 类型

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

密切相关:。