В Swift 4.1 появилось разделение flatMap на два отдельных метода:
flatMap - для "разглаживания" коллекцийcompactMap - для работы с опционаламиЭто изменение было внесено для устранения двусмысленности в использовании flatMap.
Назначение: Преобразует и объединяет (разглаживает) коллекции коллекций в одну плоскую коллекцию.
let nestedArrays = [[1, 2, 3], [4, 5, 6]]
let flattened = nestedArrays.flatMap { $0 }
// Результат: [1, 2, 3, 4, 5, 6]
Ключевые особенности:
Назначение: Трансформирует элементы коллекции с автоматической фильтрацией nil значений.
let strings = ["1", "2", "three", "4"]
let numbers = strings.compactMap { Int($0) }
// Результат: [1, 2, 4] ("three" отфильтровано)
Ключевые особенности:
nil значенияmap + filter nil в одном методе| Характеристика | flatMap | compactMap |
|---|---|---|
| Входные данные | Коллекция коллекций | Коллекция опционалов |
| Результат | "Разглаженная" коллекция | Коллекция без nil |
| Фильтрация nil | Нет | Да |
| Swift версия | Все версии | С 4.1 |
| Использование | Работа с вложенностями | Преобразование + фильтр |
// compactMap идеален для парсинга
let responses = ["200", "404", "500", "invalid"]
let statusCodes = responses.compactMap { Int($0) }
// [200, 404, 500]
// flatMap для объединения данных
let departments = [
["Alice", "Bob"],
["Charlie", "Diana"]
]
let allEmployees = departments.flatMap { $0 }
// ["Alice", "Bob", "Charlie", "Diana"]
let matrix = [[1, nil, 3], [nil, 5, 6]]
let values = matrix.flatMap { $0.compactMap { $0 } }
// [1, 3, 5, 6]
До Swift 4.1 flatMap использовался для обоих сценариев, что приводило к:
compactMapflatMapflatMap на compactMap где работаете с опционаламиflatMap предназначен для разглаживания коллекций коллекций в одну плоскую структуруcompactMap используется для трансформации с фильтрацией nil значенийПравильное использование этих методов делает код более выразительным и безопасным.