【问题标题】:flatMap does not filter out nil when ElementOfResult is inferred to be Optional当 ElementOfResult 被推断为 Optional 时,flatMap 不会过滤掉 nil
【发布时间】: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"
}

【问题讨论】:

标签: swift functional-programming optional flatmap


【解决方案1】:

这是flatMap()的定义

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

当您将resultTypeSpecified 的类型设置为[String?] 时,您告诉编译器ElementOfResultOptional<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 })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2012-06-15
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多