0Pricing
Swift Academy · Урок

Шаблоны стирания типов (AnySequence/AnyIterator)

Используйте AnySequence и AnyIterator , чтобы скрыть конкретные типы последовательностей и итераторов и возвращать из API «последовательность T», не раскрывая реализацию.

«Шаблоны стирания типов (AnySequence/AnyIterator)» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.

Зачем нужно стирание типов

Стирание типов скрывает конкретные типы за стабильной оболочкой. С помощью AnySequence и AnyIterator можно вернуть «последовательность элементов», не раскрывая внутреннюю структуру.

Ограничение

Последовательность имеет связанный тип (элемент), поэтому сам протокол нельзя использовать как конкретный тип значения. Нам нужна оболочка.

// Goal: return "some Sequence<Int>"
// This won't compile as a stored value type:
// let s: Sequence = [1,2,3]   // Protocol with associated types
// Instead, erase the type to AnySequence<Int>.

Оболочка AnySequence

AnySequence оборачивает любую конкретную последовательность (массив, множество или пользовательскую последовательность) и предоставляет единый тип, например AnySequence<целых чисел>.

// Build an AnySequence<Int> from an Array
let a = [1, 2, 3]
let seq1: AnySequence<Int> = AnySequence(a)
// Consume like any sequence
for x in seq1 { print(x, terminator: " ") }
print("")

Оболочка AnyIterator

AnyIterator оборачивает замыкание, создающее элементы. Оберните его в AnySequence, чтобы предоставить полноценную последовательность.

// Create an AnyIterator<Int> by hand
var i = 0
let it = AnyIterator<Int> {
    // Return next number or nil to stop
    guard i < 3 else { return nil }
    defer { i += 1 }
    return i
}
let seq2 = AnySequence(it)
for x in seq2 { print(x, terminator: " ") }  // 0 1 2
print("")

Единый тип результата

Стирание типов позволяет одной функции возвращать разные реализации под одним стабильным типом результата (AnySequence<целых чисел>).

// Return a sequence of Int without exposing concrete type
func numbers(flag: Bool) -> AnySequence<Int> {
    if flag {
        // Array-based
        return AnySequence([10, 20, 30])
    } else {
        // Lazy generated with AnyIterator
        var n = 1
        let it = AnyIterator<Int> {
            guard n <= 3 else { return nil }
            defer { n += 1 }
            return n * 100
        }
        return AnySequence(it)
    }
}

for x in numbers(flag: true)  { print(x, terminator: " ") }  // 10 20 30
print("")
for x in numbers(flag: false) { print(x, terminator: " ") }  // 100 200 300
print("")

Когда это использовать

Используйте стирание типов, когда:

  • Вы хотите скрыть детали реализации последовательностей и итераторов.
  • Программные интерфейсы должны возвращать один и тот же тип независимо от внутренних ветвлений.
  • Обобщённые типы становятся слишком заметными на границах программного интерфейса.

Примечания: внутри модулей отдавайте предпочтение обобщённым типам ради производительности и ясности; при необходимости используйте AnySequence/AnyIterator на границах.

Назначение AnySequence

Быстрая проверка: что даёт вам AnySequence<T>?

Повторение

Повторение: оборачивайте конкретные последовательности и итераторы в AnySequence / AnyIterator, чтобы стереть типы и возвращать из гибких программных интерфейсов «последовательность T».

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

Урок «Шаблоны стирания типов (AnySequence/AnyIterator)» бесплатный?

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

Чему я научусь в уроке «Шаблоны стирания типов (AnySequence/AnyIterator)»?

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

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

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

Сколько времени занимает урок «Шаблоны стирания типов (AnySequence/AnyIterator)»?

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

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

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

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

  1. associatedtype и обобщённые протоколы
  2. Шаблоны стирания типов (AnySequence/AnyIterator)
  3. Когда использовать existential (any P), а когда — generics
← Назад к Swift Academy