0Pricing
Swift Academy · Урок

Пользовательские итераторы и советы по производительности

Реализуйте пользовательские итераторы и последовательности и сохраняйте их эффективность: используйте однопроходное поведение, избегайте лишних выделений памяти и применяйте ленивые представления.

«Пользовательские итераторы и советы по производительности» — бесплатный урок 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 — локальная установка не требуется.

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

  1. Иерархии Sequence и Collection
  2. Map/Filter/Reduce, ленивые последовательности
  3. Пользовательские итераторы и советы по производительности
← Назад к Swift Academy