1

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

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

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

当我使用flatMap喜欢

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

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

4

2 回答 2

4

您可以Optional.map在第二个元组元素上使用它来解包或将其删除(通过外部),并在第三个元组元素上使用flatMapnil-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", "")]

If t.1is nilthent.1.map {...}计算结果nil并被 忽略flatMap。否则t.1.map {...}计算闭包的值,$0作为展开的第二个元组元素。

于 2018-02-06T10:59:54.437 回答
1

可能,filter可以帮助你:

let arrayOfTuples: [(Int, String?, String?)] = [(1, nil, nil), (2, "", nil)]
let result = arrayOfTuples.filter({ $0.1 != nil })
print(result) // [(2, Optional(""), nil)]
于 2018-02-06T10:54:02.817 回答