0Pricing
Swift Academy · Урок

Свойство lazy

Откладывайте преобразования до тех пор, пока они не понадобятся.

«Свойство lazy» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Жадные вычисления по умолчанию

Стандартные методы коллекций выполняются жадно: map, filter и другие запускаются немедленно и сразу создают новый массив целиком, даже если Вы читаете только первый элемент.

Жадные вычисления выполняются сразу

Здесь весь преобразованный массив создаётся заранее:

let nums = [1, 2, 3, 4, 5]
let doubled = nums.map { $0 * 2 }  // whole array built now
print(doubled.first!)  // 2

Свойство lazy

У каждой коллекции есть представление .lazy. Операции над ленивым представлением откладываются: они не выполняются, пока Вы действительно не начнёте перебирать элементы или не запросите конкретный элемент.

Создание ленивого представления

Просто добавьте .lazy в начало цепочки:

let nums = [1, 2, 3, 4, 5]
let view = nums.lazy.map { $0 * 2 }
// nothing computed yet
print(Array(view))  // [2, 4, 6, 8, 10]

Доказательство отложенного выполнения

Побочные эффекты показывают, что замыкание выполняется только по требованию:

let nums = [1, 2, 3]
let lazyMapped = nums.lazy.map { n -> Int in
    print("transforming \(n)")
    return n * 2
}
print("created view")
print(lazyMapped.first!)  // prints "transforming 1" then 2

Ленивый режим возвращает другой тип

Ленивая цепочка — это лёгкая оболочка, а не Array:

let nums = [1, 2, 3]
let view = nums.lazy.map { $0 + 1 }
print(type(of: view).self != [Int].self)  // true -- it is a LazyMapSequence

Материализация ленивого представления

Преобразуйте его обратно в обычный массив с помощью Array(...), когда нужно сохранить или вернуть результат:

let nums = [1, 2, 3]
let result: [Int] = Array(nums.lazy.map { $0 * 10 })
print(result)  // [10, 20, 30]

Ленивый режим и поиск первого подходящего элемента

Преимущества ленивого режима особенно заметны, когда обработку можно завершить досрочно. Обрабатывается ровно столько элементов, сколько нужно для поиска совпадения:

let nums = [1, 2, 3, 4, 5, 6]
let firstBig = nums.lazy.map { $0 * $0 }.first { $0 > 10 }
print(firstBig!)  // 16  (stops at 4*4)

Ленивый режим для диапазона

Диапазоны тоже поддерживают ленивый режим, что удобно для больших или практически бесконечных последовательностей:

let firstThree = (1...1000).lazy.map { $0 * $0 }.prefix(3)
print(Array(firstThree))  // [1, 4, 9]

Когда представление вычисляется заново

Ленивое представление вычисляется заново при каждом переборе — оно не сохраняет результаты. Если перебрать его дважды, преобразование выполнится дважды:

var calls = 0
let view = [1, 2].lazy.map { (n: Int) -> Int in calls += 1; return n }
_ = Array(view)
_ = Array(view)
print(calls)  // 4

Когда использовать ленивый режим

Добавляйте .lazy, если у Вас длинная цепочка, но Вы используете только часть результата — первое совпадение, начало последовательности или один результат свёртки. Для небольших массивов, которые используются целиком, жадный вариант проще.

let nums = Array(1...100)
let result = nums.lazy.filter { $0 % 7 == 0 }.first
print(result!)  // 7

Быстрая проверка

Что свойство .lazy меняет в работе map и filter?

Повторение

Вы изучили основы ленивых вычислений:

  • Стандартные методы коллекций выполняются жадно — они сразу создают массивы
  • .lazy возвращает отложенное представление (специальный тип последовательности)
  • Работа выполняется только при переборе элементов или запросе элемента
  • Материализуйте представление с помощью Array(...); представления вычисляются заново при каждом переборе

Далее: ленивые цепочки отображения и фильтрации.

Часто задаваемые вопросы

Урок «Свойство lazy» бесплатный?

Да — полный текст урока «Свойство lazy» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Свойство lazy»?

Откладывайте преобразования до тех пор, пока они не понадобятся. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Свойство lazy»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Свойство lazy
  2. Ленивые map и filter
  3. Компромиссы ленивого и немедленного вычисления
  4. Создание собственных ленивых последовательностей
← Назад к Swift Academy