0Pricing
Swift Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. map и compactMap
  2. filter и предикаты
  3. reduce и reduce(into:)
  4. flatMap и цепочки
← Назад к Swift Academy