【发布时间】:2017-07-02 01:51:36
【问题描述】:
flatMap 的 Swift 文档内容如下:
返回一个数组,其中包含调用给定的非零结果 用这个序列的每个元素进行转换。
在下面的示例中,当ElementOfResult 的返回类型留给编译器以推断flatMap 的工作方式与文档相同,但在第5 行,当ElementOfResult 被指定时,因此推断为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"
}
【问题讨论】:
-
记住
flatMap(_:)返回[ElementOfResult],闭包返回类型为ElementOfResult?。因此,如果您将返回注释为[String?],则表示闭包返回String??。因此,可选元素被提升为双重包装的可选元素,因此都是.some,因此它们是“非nil”。尝试将flatMap(_:)的返回注释为[String],就像我在my answer to your previous question 中显示的那样。
标签: swift functional-programming optional flatmap