Пользовательские итераторы и советы по производительности
Реализуйте пользовательские итераторы и последовательности и сохраняйте их эффективность: используйте однопроходное поведение, избегайте лишних выделений памяти и применяйте ленивые представления.
«Пользовательские итераторы и советы по производительности» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Пользовательские итераторы: основы
Создавайте собственные IteratorProtocol и последовательности. Итераторы обычно поддерживают один проход и должны возвращать nil в конце.
Пример IteratorProtocol
Реализуйте next(), чтобы возвращать по одному элементу за вызов и изменять состояние; для завершения верните nil.
struct CountdownIterator: IteratorProtocol {
var current: Int
mutating func next() -> Int? {
guard current >= 0 else { return nil }
defer { current -= 1 } // advance state
return current
}
}
var it = CountdownIterator(current: 3)
while let n = it.next() { print(n, terminator: " ") } // 3 2 1 0
print("")Обёртка последовательности
Последовательность предоставляет makeIterator(). Теперь вы можете использовать for-in, map, filter и другие операции.
struct Countdown: Sequence {
let start: Int
func makeIterator() -> CountdownIterator {
CountdownIterator(current: start)
}
}
for n in Countdown(start: 5) {
print(n, terminator: " ") // 5 4 3 2 1 0
}
print("")Сокращённый способ AnyIterator
AnyIterator/AnySequence позволяют быстро создавать итераторы с помощью замыкания — это удобно для лёгких генераторов.
// Build an iterator from a closure
var i = 1
let anyIt = AnyIterator<Int> {
guard i <= 3 else { return nil }
defer { i += 1 }
return i * 10
}
let numbers = AnySequence(anyIt)
for x in numbers { print(x, terminator: " ") } // 10 20 30
print("")Ленивый режим для экономии работы
Предпочитайте ленивый режим, когда нужна только часть конвейера; он экономит выделения памяти и вычисления.
let big = Array(1...10_000)
// Eager: builds two intermediate arrays
let eager = big.map { $0 * 2 }.filter { $0 % 3 == 0 }
// Lazy: no temporaries; work is done during collection
let lazyView = big.lazy.map { $0 * 2 }.filter { $0 % 3 == 0 }
let result = Array(lazyView.prefix(5)) // only first 5 actually computed
print(result)Советы по производительности
Советы:
- Делайте итераторы простыми: изменяйте состояние и возвращайте
nilв конце. - Используйте ленивый режим, чтобы избежать промежуточных массивов.
- Резервируйте ёмкость для результатов, когда известен размер (
res.reserveCapacity(n)). - Предпочитайте алгоритмы коллекций, когда нужны несколько проходов или индексы.
Правило итератора
Быстрая проверка: что должен делать next() в конце перебора?
Повторение
Повторение: напишите минимальный IteratorProtocol, оберните его в последовательность и поддерживайте эффективность конвейеров с помощью ленивого режима и предварительного выделения памяти, когда это возможно.
Часто задаваемые вопросы
Урок «Пользовательские итераторы и советы по производительности» бесплатный?
Да — полный текст урока «Пользовательские итераторы и советы по производительности» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Пользовательские итераторы и советы по производительности»?
Реализуйте пользовательские итераторы и последовательности и сохраняйте их эффективность: используйте однопроходное поведение, избегайте лишних выделений памяти и применяйте ленивые представления. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «Пользовательские итераторы и советы по производительности»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Иерархии Sequence и Collection
- Map/Filter/Reduce, ленивые последовательности
- Пользовательские итераторы и советы по производительности