Swift flatMap: как удалить только кортежи из массива, где определенный элемент в кортеже равен нулю?

У меня есть массив кортежей, где кортеж содержит некоторые необязательные значения:

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

Как лучше всего удалить из массива те кортежи, где второй элемент кортежа равен нулю (независимо от того, равен ли 3-й элемент нулю)?

Когда я использую flatMap как

let flatTuplesArray: [(Int, String, String)] = arrayOfTuples.flatMap({ ($0, $1, $2) }), то кортеж не появляется в результирующем flatTuplesArray, если второй или третий элемент кортежа равен нулю.

Я хочу применить flatMap только к первым двум элементам кортежа ($0 и $1), но результирующий массив все равно должен содержать кортежи с тремя элементами (и содержать "" для нулевых значений $2).


person Super Geroy    schedule 06.02.2018    source источник


Ответы (2)


Вы можете использовать Optional.map для второго элемента кортежа, чтобы либо развернуть его, либо удалите его (внешним flatMap) и нулевое объединение ?? в третьем элементе кортежа, чтобы заменить 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.1 равно nil, тогда t.1.map {...} оценивается как nil и игнорируется flatMap. В противном случае t.1.map {...} оценивается как значение замыкания, а $0 является развернутым вторым элементом кортежа.

person Martin R    schedule 06.02.2018

Возможно, filter сможет вам помочь:

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