Свойство 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 — локальная установка не требуется.
Все уроки этого курса
- Свойство lazy
- Ленивые map и filter
- Компромиссы ленивого и немедленного вычисления
- Создание собственных ленивых последовательностей