首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当flatMap被推断为可选时,ElementOfResult不会筛选出零。

当flatMap被推断为可选时,ElementOfResult不会筛选出零。
EN

Stack Overflow用户
提问于 2017-02-13 22:41:33
回答 1查看 658关注 0票数 1

flatMap的快速文档如下:

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

在下面的示例中,当ElementOfResult的返回类型留给编译器来推断flatMap的工作方式与文档相同时,但是在指定ElementOfResult时,在第5行,因此推断为Optional<String>类型时,flatMap似乎停止过滤nil的类型。

它为什么要这么做?

代码语言:javascript
复制
~ 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"
}
EN

回答 1

Stack Overflow用户

发布于 2017-02-13 22:58:34

以下是flatMap()的定义

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

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

转换闭包有一种(String?) -> Optional<Optional<String>>类型。

flatMap将带走1“层”的选项,但不是2层。

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

代码语言:javascript
复制
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 })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42214880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档