Проблема в понимании CompactMap & FlatMap - PullRequest
2 голосов
/ 03 апреля 2019

Я прошел через несколько уроков, в которых flatMap/compactMap используется для flatten массива массива, но в моем случае он не работает или я не понимаю его правильно.

let myArray = [["Raja","Kumar", nil,"Waqas"],["UAE","SINGAPORE","dUBAI","HONGKONG"]]
let final = myArray.compactMap{ $0 }

print("Result:\(final)")

OutPut:

Result:[[Optional("Raja"), Optional("Kumar"), nil, Optional("Waqas")], [Optional("UAE"), Optional("SINGAPORE"), Optional("dUBAI"), Optional("HONGKONG")]]

Я пытался удалить nil из вышеуказанного массива, но все равно он не сглаживает мой массив.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 03 апреля 2019

.compactMap

... используется для создания списка без необязательных объектов, вам нужно использовать compactMap во внутреннем массиве, где вы получили nil s, например:

let result = myArray.map { $0.compactMap { $0 } }

Результат: [["Raja", "Kumar", "Waqas"], ["UAE", "SINGAPORE", "dUBAI", "HONGKONG"]]


.flatmap

... используется для выравнивания коллекции, например

let result = myArray.flatMap { $0.compactMap { $0 } }

Результат: ["Raja", "Kumar", "Waqas", "UAE", "SINGAPORE", "dUBAI", "HONGKONG"]

3 голосов
/ 03 апреля 2019

Пожалуйста, прочитайте документацию

map (_:)

Возвращает массив, содержащий результаты отображения заданного замыканияповерх элементов последовательности.

compactMap (_:)

Возвращает массив, содержащий non-nil результаты извызов данного преобразования с каждым элементом этой последовательности.

flatMap (_:)

Возвращает массив, содержащий объединенные результаты вызова данного преобразования с каждым элементом этой последовательности.

Каждый Обсуждение раздел содержит пример.

3 голосов
/ 03 апреля 2019

compactMap следует использовать для фильтрации nil элементов из массива Optional с, а flatMap можно использовать для сглаживания многомерного массива.Тем не менее, вам нужно сделать оба.

let final = myArray.flatMap{$0.compactMap{$0}}

print("Result:\(final)")
...