Иерархии Sequence и Collection
Разберитесь с различиями между Sequence и Collection (а также Bidirectional и RandomAccess): гарантиями обхода, индексами и случаями, когда алгоритмам нужны более строгие протоколы.
«Иерархии Sequence и Collection» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Карта иерархии
Иерархия перебираемых типов:
- Последовательность: перебор через итератор (может поддерживать только один проход).
- Коллекция: несколько проходов, доступ по индексам (startIndex/endIndex).
- BidirectionalCollection: позволяет перемещать индексы назад.
- RandomAccessCollection: обеспечивает переходы по индексам за постоянное время.
Перебор последовательности
Последовательность гарантирует, что элементы можно перебирать по порядку; требования к индексам и возможности нескольких проходов отсутствуют.
let seq = [1, 2, 3] as AnySequence<Int> // wrap as AnySequence for demo
for x in seq { print(x, terminator: " ") }
print("")Индексы коллекции
Коллекция добавляет индексы и позволяет выполнять несколько проходов. Вы можете безопасно повторить перебор.
let arr = ["a","b","c"] // Array is a Collection
print(arr.startIndex == 0) // true for Array
print(arr.endIndex == 3) // endIndex is "one past last"
for i in arr.indices { print(arr[i], terminator: " ") }
print("")
// Iterate again (multi-pass)
for ch in arr { print(ch, terminator: " ") }
print("")Более широкие возможности
BidirectionalCollection позволяет перемещать индексы назад. RandomAccessCollection поддерживает переходы по индексам за постоянное время (например, в массиве).
let text = "Swift" // String is a BidirectionalCollection
var i = text.index(before: text.endIndex) // move backward
print(text[i]) // last character
// Array is RandomAccessCollection: jumping indices is cheap
let nums = [10,20,30,40]
print(nums[nums.startIndex.advanced(by: 2)]) // 30Пользовательская последовательность
Пользовательская последовательность может поддерживать только один проход. После однократного перебора итератор может оказаться исчерпанным.
struct Countdown: Sequence, IteratorProtocol {
var current: Int
mutating func next() -> Int? {
guard current >= 0 else { return nil }
defer { current -= 1 }
return current
}
}
var cd = Countdown(current: 3)
for n in cd { print(n, terminator: " ") } // 3 2 1 0
print("")
// cd is exhausted; iterating again yields nothing (single-pass behavior)Выбор подходящего протокола
Рекомендации:
- Используйте обобщённые алгоритмы для последовательности, когда достаточно одного прохода.
- Требуйте коллекцию для нескольких проходов или операций с индексами.
- Предпочитайте RandomAccessCollection для алгоритмов, которые часто переходят между индексами (например, для двоичного поиска).
Коллекция и последовательность
Быстрая проверка: что коллекция добавляет к последовательности?
Повторение
Повторение: последовательность → базовый перебор. Коллекция → индексы и несколько проходов. Двунаправленная коллекция → перемещение назад. Коллекция с произвольным доступом → переходы по индексам за постоянное время. Выбирайте минимально необходимый для алгоритма протокол.
Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «Иерархии Sequence и Collection» бесплатный?
Да — полный текст урока «Иерархии Sequence и Collection» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Иерархии Sequence и Collection»?
Разберитесь с различиями между Sequence и Collection (а также Bidirectional и RandomAccess): гарантиями обхода, индексами и случаями, когда алгоритмам нужны более строгие протоколы. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.
Сколько времени занимает урок «Иерархии Sequence и Collection»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Иерархии Sequence и Collection
- Map/Filter/Reduce, ленивые последовательности
- Пользовательские итераторы и советы по производительности