В 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
использовался для обоих сценариев, что приводило к:
compactMap
flatMap
flatMap
на compactMap
где работаете с опционаламиflatMap
предназначен для разглаживания коллекций коллекций в одну плоскую структуруcompactMap
используется для трансформации с фильтрацией nil значенийПравильное использование этих методов делает код более выразительным и безопасным.