map и compactMap
Преобразуйте элементы и удаляйте nil.
«map и compactMap» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Что такое отображение
map — это функция высшего порядка: она принимает замыкание, применяет его к каждому элементу последовательности и возвращает новый массив преобразованных результатов.
- Исходная коллекция никогда не изменяется
- Количество элементов результата всегда равно количеству элементов входных данных
- Тип элементов может измениться (например,
Int→String)
Простое отображение
Удвоим каждое число в массиве:
let numbers = [1, 2, 3, 4]
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8]Изменение типа элементов
Отображение может преобразовать значения типа Int в значения типа String:
let ids = [10, 20, 30]
let labels = ids.map { "ID-\($0)" }
print(labels) // ["ID-10", "ID-20", "ID-30"]Отображение с именованной функцией
Можно передать любую функцию с подходящей сигнатурой, а не только замыкание в конце:
let words = ["swift", "map"]
let upper = words.map { $0.uppercased() }
print(upper) // ["SWIFT", "MAP"]Проблема, которую не решает отображение
Отображение сохраняет каждый элемент. Если результатом преобразования является необязательное значение (операция может завершиться неудачей), Вы получаете массив необязательных значений вроде [Int?] — с множеством пропусков nil, которые позже придётся отфильтровать.
Именно эту проблему решает compactMap.
Знакомьтесь: compactMap
compactMap преобразует каждый элемент и удаляет результаты, равные nil, возвращая массив без необязательных значений:
let raw = ["1", "2", "x", "4"]
let nums = raw.compactMap { Int($0) }
print(nums) // [1, 2, 4] -- "x" was droppedОтображение и compactMap: сравнение
Разница заключается в том, сохраняются ли результаты, равные nil:
let raw = ["1", "x", "3"]
print(raw.map { Int($0) }) // [Optional(1), nil, Optional(3)]
print(raw.compactMap { Int($0) }) // [1, 3]Извлечение значений из необязательных элементов коллекции
compactMap — идиоматичный способ удалить значения nil из массива необязательных значений:
let maybe: [Int?] = [1, nil, 3, nil, 5]
let clean = maybe.compactMap { $0 }
print(clean) // [1, 3, 5]Разбор данных с помощью compactMap
Распространённый практический пример: разобрать только корректные строки входных данных:
let lines = ["42", "", "hello", "7"]
let values = lines.compactMap { Int($0) }
print(values) // [42, 7]
print(values.reduce(0, +)) // 49Объединение отображения и compactMap
Их можно объединять в цепочку: с помощью отображения придать данным нужную форму, а с помощью compactMap оставить только успешные результаты:
let scores = ["90", "85", "n/a", "70"]
let passed = scores
.compactMap { Int($0) }
.map { $0 >= 80 ? "pass" : "fail" }
print(passed) // ["pass", "pass", "fail"]compactMap в цепочках необязательных значений
Он также прекрасно работает с обращением к необязательным свойствам:
struct User { let name: String? }
let users = [User(name: "Ann"), User(name: nil), User(name: "Bo")]
let names = users.compactMap { $0.name }
print(names) // ["Ann", "Bo"]Быстрая проверка
Какая функция за один шаг преобразует элементы и удаляет результаты, равные nil?
Повторение
Вы изучили две основные функции преобразования:
map— преобразует каждый элемент, количество элементов результата равно количеству элементов входных данныхcompactMap— преобразует элементы и удаляетnil; отлично подходит для разбора данных и извлечения необязательных значений- Обе функции возвращают новые массивы и никогда не изменяют исходный
- Их можно объединять в цепочку, чтобы аккуратно преобразовывать, а затем фильтровать данные
Далее: фильтрация с помощью предикатов.
Часто задаваемые вопросы
Урок «map и compactMap» бесплатный?
Да — полный текст урока «map и compactMap» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «map и compactMap»?
Преобразуйте элементы и удаляйте nil. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «map и compactMap»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- map и compactMap
- filter и предикаты
- reduce и reduce(into:)
- flatMap и цепочки