flatMap的快速文档如下:
返回一个数组,该数组包含调用该序列中每个元素的给定转换的非零结果。
在下面的示例中,当ElementOfResult的返回类型留给编译器来推断flatMap的工作方式与文档相同时,但是在指定ElementOfResult时,在第5行,因此推断为Optional<String>类型时,flatMap似乎停止过滤nil的类型。
它为什么要这么做?
~ swift
Welcome to Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1). Type :help for assistance.
1> let words = ["1989", nil, "Fearless", nil, "Red"]
words: [String?] = 5 values {
[0] = "1989"
[1] = nil
[2] = "Fearless"
[3] = nil
[4] = "Red"
}
2> words.flatMap { $0 }
$R0: [String] = 3 values {
[0] = "1989"
[1] = "Fearless"
[2] = "Red"
}
3> let resultTypeInferred = words.flatMap { $0 }
resultTypeInferred: [String] = 3 values {
[0] = "1989"
[1] = "Fearless"
[2] = "Red"
}
4> let resultTypeSpecified: [String?] = words.flatMap { $0 }
resultTypeSpecified: [String?] = 5 values {
[0] = "1989"
[1] = nil
[2] = "Fearless"
[3] = nil
[4] = "Red"
}发布于 2017-02-13 22:58:34
以下是flatMap()的定义
public func flatMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
当您将resultTypeSpecified的类型设置为[String?]时,可以告诉编译器ElementOfResult是Optional<String>。
转换闭包有一种(String?) -> Optional<Optional<String>>类型。
flatMap将带走1“层”的选项,但不是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 })https://stackoverflow.com/questions/42214880
复制相似问题