flatMap и цепочки
Выравнивайте вложенные коллекции и объединяйте преобразования в цепочку.
«flatMap и цепочки» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Два варианта плоского отображения
flatMap для последовательности раскрывает один уровень вложенности. Он применяет замыкание, возвращающее последовательность для каждого элемента, а затем объединяет все эти последовательности в один плоский массив.
Объединение вложенных массивов
Преобразуем массив массивов в один массив:
let nested = [[1, 2], [3, 4], [5]]
let flat = nested.flatMap { $0 }
print(flat) // [1, 2, 3, 4, 5]Плоское отображение с созданием последовательностей
Каждый элемент может преобразоваться в несколько элементов:
let nums = [1, 2, 3]
let expanded = nums.flatMap { [$0, $0 * 10] }
print(expanded) // [1, 10, 2, 20, 3, 30]Сочетание всех вариантов
Плоское отображение удобно для построения декартовых произведений:
let suits = ["Hearts", "Spades"]
let ranks = ["A", "K"]
let deck = suits.flatMap { suit in ranks.map { "\($0) of \(suit)" } }
print(deck) // ["A of Hearts", "K of Hearts", "A of Spades", "K of Spades"]Плоское отображение и compactMap
Раньше flatMap также извлекал значения из необязательных элементов, но теперь эту роль выполняет compactMap. Сегодня:
flatMap— объединяет вложенные последовательностиcompactMap— удаляетnilиз результатов, являющихся необязательными значениями
Преобразование слов в символы
Развернём каждую строку в последовательность символов:
let words = ["hi", "yo"]
let chars = words.flatMap { Array($0) }
print(chars) // ["h", "i", "y", "o"]Объединение промежуточных результатов
Соберём элементы из вложенных объектов модели:
struct Team { let members: [String] }
let teams = [Team(members: ["Ann", "Bo"]), Team(members: ["Cy"])]
let all = teams.flatMap { $0.members }
print(all) // ["Ann", "Bo", "Cy"]Объединение преобразований в цепочку
Настоящая сила проявляется в объединении операций в цепочку: map, filter, flatMap и reduce читаются сверху вниз как конвейер обработки данных. Каждый шаг создаёт новую последовательность для следующего шага.
Полный конвейер
Отфильтруем, развернём, преобразуем, а затем просуммируем:
let groups = [[1, 2, 3], [4, 5], [6]]
let result = groups
.flatMap { $0 }
.filter { $0 % 2 == 0 }
.map { $0 * $0 }
.reduce(0, +)
print(result) // 4 + 16 + 36 = 56Плоское отображение, затем compactMap
Сначала развернём последовательность, затем оставим только значения, которые можно разобрать:
let rows = [["1", "x"], ["3", "4"]]
let nums = rows
.flatMap { $0 }
.compactMap { Int($0) }
print(nums) // [1, 3, 4]Как сохранить цепочки понятными
Размещайте каждый шаг на отдельной строке и присваивайте имена промежуточным результатам, если цепочка становится длинной. Понятность важнее попытки уместить всё в одном выражении.
let names = ["ann", "BO", "cy"]
let titled = names
.map { $0.lowercased() }
.map { $0.capitalized }
.sorted()
print(titled) // ["Ann", "Bo", "Cy"]Быстрая проверка
Что возвращает [[1, 2], [3]].flatMap { $0 }?
Повторение
Вы изучили объединение последовательностей и построение цепочек:
flatMapраскрывает один уровень вложенных последовательностей- Используйте
compactMap, а не flatMap, чтобы удалять необязательные значения - Объединяйте
filter/map/flatMap/reduceв понятные конвейеры - Один шаг на строку помогает сохранить ясность длинных цепочек
Курс завершён! Далее: ленивые последовательности.
Часто задаваемые вопросы
Урок «flatMap и цепочки» бесплатный?
Да — полный текст урока «flatMap и цепочки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «flatMap и цепочки»?
Выравнивайте вложенные коллекции и объединяйте преобразования в цепочку. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «flatMap и цепочки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- map и compactMap
- filter и предикаты
- reduce и reduce(into:)
- flatMap и цепочки