Swift flatMap:如何从数组中仅删除元组中特定元素为零的元组?

Posted

技术标签:

【中文标题】Swift flatMap:如何从数组中仅删除元组中特定元素为零的元组?【英文标题】:Swift flatMap: How to remove only tuples from an array where specific element in the tuple is nil? 【发布时间】:2018-02-06 10:51:31 【问题描述】:

我有一个元组数组,其中元组包含一些可选值:

let arrayOfTuples: [(Int, String?, String?)] = ...

我怎样才能最好地从数组中删除元组的 第二个元素 为 nil 的元组(无论第三个元素是否为 nil)?

当我使用flatMap 时喜欢

let flatTuplesArray: [(Int, String, String)] = arrayOfTuples.flatMap( ($0, $1, $2) ) 如果元组的第二个或第三个元素 为零,则元组不会出现在结果flatTuplesArray 中。

我想应用 flatMap 仅在元组的前两个元素($0 和 $1)上,但结果数组应该仍然包含三个元素的元组(并且包含 "" 为 $2零值)。

【问题讨论】:

【参考方案1】:

您可以在第二个元组元素上使用Optional.map 来展开 它或将其删除(通过外部 flatMap),以及第三个元组元素上的 nil-coalescing ?? 用空字符串替换nil

let arrayOfTuples: [(Int, String?, String?)] = [(1, "a", "b"), (2, nil, "c"), (3, "d", nil)]

let flatTuplesArray = arrayOfTuples.flatMap 
    t in t.1.map  (t.0, $0, t.2 ?? "") 


print(flatTuplesArray)
// [(1, "a", "b"), (3, "d", "")]

如果 t.1nilt.1.map ... 计算结果为 nil 并且是 被flatMap 忽略。否则 t.1.map ... 评估为 闭包的值,$0unwrapped 秒 元组元素。

【讨论】:

【参考方案2】:

或许filter可以帮到你:

let arrayOfTuples: [(Int, String?, String?)] = [(1, nil, nil), (2, "", nil)]
let result = arrayOfTuples.filter( $0.1 != nil )
print(result) // [(2, Optional(""), nil)]

【讨论】:

以上是关于Swift flatMap:如何从数组中仅删除元组中特定元素为零的元组?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 使用 map/reduce/flatmap 将数组字典减少为相同类型的单个数组

理解Swift中map 和 flatMap对集合的作用

Swift --> Map & FlatMap

理解Swift中map 和 flatMap对集合的作用

swift中高阶函数mapflatMapfilterreduce

swift 高级用法