代码之家  ›  专栏  ›  技术社区  ›  Sweeper

为什么我不能调用map<U>(\utransform:(Wrapped)->U)->U?同时使用可选链接?

  •  1
  • Sweeper  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  1
  •   Sweeper    6 年前

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

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

    我想这是因为 ? 具有较低的优先级,或者可选的链接与其他表达式的工作方式不同。加上括号可能会导致 s?.hashValue

    编辑:

    以下是本报告的相关摘录 Swift reference :

    如果包含可选链接表达式的后缀表达式 嵌套在其他后缀表达式中,只有最外层的 表达式返回可选类型。在下面的例子中,当c是 其值用于计算.performAction()。整个 表达式c?。性能()的值为可选值 类型。

    所以呢 s?。哈希值 ()