Шаблоны стирания типов (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 — локальная установка не требуется.
Все уроки этого курса
- associatedtype и обобщённые протоколы
- Шаблоны стирания типов (AnySequence/AnyIterator)
- Когда использовать existential (any P), а когда — generics