当ElementOfResult被推断为Optional时,flatMap不会过滤掉nil

时间:2017-02-13 22:41:34

标签: swift functional-programming optional flatmap

flatMap的swift文档读取:

  

返回一个包含调用给定的非零结果的数组   用这个序列的每个元素进行转换。

在以下示例中,返回类型echo留给编译器以推断ElementOfResult按照文档记录工作,但在第5行指定flatMap时,因此推断为{ {1}}输入似乎ElementOfResult停止过滤掉Optional<String>

为什么这样做?

flatMap

1 个答案:

答案 0 :(得分:2)

以下是flatMap()

的定义
  

public func flatMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

当您将resultTypeSpecified的类型设置为[String?]时,您告诉编译器ElementOfResultOptional<String>

您的转换闭包的类型为(String?) -> Optional<Optional<String>>

flatMap将带走1&#34;图层&#34;期权而非2层。

希望这个例子能让事情更清楚:

let input: [String??] = [
    Optional.some(Optional.some("1989")),
    Optional.some(Optional.none),
    Optional.some(Optional.some("Fearless")),
    Optional.some(Optional.none),
    Optional.some(Optional.some("Red"))
]

let output = input.flatMap({ $0 })