Ответ
flatMap — это функция высшего порядка, которая выполняет два действия:
- Преобразует каждый элемент коллекции с помощью замыкания (как
map). - "Разглаживает" (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.
Почему полезен: Упрощает работу с вложенными структурами данных и преобразованиями, которые могут возвращать коллекции.