【问题标题】:Why can't I call map<U>(_ transform: (Wrapped) -> U) -> U? and use optional chaining at the same time?为什么我不能调用 map<U>(_ transform: (Wrapped) -> U) -> U?并同时使用可选链接?
【发布时间】:2019-02-16 17:54:45
【问题描述】:

我知道这样的可选链接:

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 的方法。

我该怎么做?

【问题讨论】:

标签: swift optional optional-chaining


【解决方案1】:

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

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

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

编辑:

这是Swift reference的相关摘录:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2012-09-08
    • 2016-07-21
    • 2016-04-24
    相关资源
    最近更新 更多