Как работает метод flatMap в Swift и чем отличается от map?

«Как работает метод flatMap в Swift и чем отличается от map?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

flatMap — это функция высшего порядка, которая выполняет два действия:

  1. Преобразует каждый элемент коллекции с помощью замыкания (как map).
  2. "Разглаживает" (flattens) результат, объединяя вложенные коллекции в одну одномерную последовательность.

Основные сценарии использования:

1. Преобразование с изменением количества элементов:

let numbers = [1, 2, 3]
let doubledAndOriginal = numbers.flatMap { [$0, $0 * 2] }
// Результат: [1, 2, 2, 4, 3, 6]

2. Обработка опциональных значений (до Swift 4.1):

let strings = ["1", "2", "three"]
let numbers = strings.flatMap { Int($0) }
// Результат: [1, 2] — nil значения отфильтрованы
// В Swift 4.1+ для этой цели используйте compactMap

3. Работа с вложенными коллекциями:

let matrix = [[1, 2], [3, 4], [5]]
let flattened = matrix.flatMap { $0 }
// Результат: [1, 2, 3, 4, 5]

Отличие от map:

let mapResult = numbers.map { [$0, $0 * 2] }
// Результат: [[1, 2], [2, 4], [3, 6]] — массив массивов

let flatMapResult = numbers.flatMap { [$0, $0 * 2] }
// Результат: [1, 2, 2, 4, 3, 6] — плоский массив

Важно: Начиная с Swift 4.1:

  • flatMap — только для разглаживания.
  • compactMap — для преобразования с фильтрацией nil.

Почему полезен: Упрощает работу с вложенными структурами данных и преобразованиями, которые могут возвращать коллекции.