Swift Academy · Урок

Косвенные перечисления и рекурсивные структуры

Создавайте связанные списки и деревья с помощью косвенных вариантов перечисления.

Урок 3 из 412 шагов

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

Введение

Вариант перечисления `indirect` хранит ассоциированное значение за указателем, что позволяет создавать рекурсивные структуры данных, такие как связанные списки, деревья и деревья выражений.

Зачем нужен indirect

Без `indirect` перечисление, ссылающееся на себя, имело бы бесконечный размер: ```swift enum List { case empty case node(T, List) // ❌ recursive without size bound } ``` `indirect` добавляет выделение памяти в куче, поэтому размером становится всего лишь указатель.

Определение непрямого перечисления

```swift indirect enum List { case empty case node(T, List) } let list = List.node(1, .node(2, .node(3, .empty))) // [1, 2, 3] ```

Пример двоичного дерева

```swift indirect enum Tree { case leaf case branch(left: Tree, value: T, right: Tree) } let t = Tree.branch(left: .leaf, value: 5, right: .branch(left:.leaf, value:10, right:.leaf)) ```

Рекурсивная функция для непрямого перечисления

```swift func sum(_ list: List) -> Int { switch list { case .empty: return 0 case .node(let value, let rest): return value + sum(rest) } } print(sum(list)) // 6 ```

Высота дерева

```swift func height(_ tree: Tree) -> Int { switch tree { case .leaf: return 0 case .branch(let l, _, let r): return 1 + max(height(l), height(r)) } } ```

Деревья выражений

```swift indirect enum Expr { case num(Double) case add(Expr, Expr) case mul(Expr, Expr) } func eval(_ e: Expr) -> Double { switch e { case .num(let n): return n case .add(let a, let b): return eval(a) + eval(b) case .mul(let a, let b): return eval(a) * eval(b) } } print(eval(.mul(.num(2), .add(.num(3), .num(4))))) // 14 ```

Непрямой вариант перечисления

Можно пометить `indirect` только рекурсивные варианты, а не всё перечисление: ```swift enum Tree { case leaf indirect case branch(left: Tree, value: T, right: Tree) } ``` Это точнее: выделение памяти в куче требуется только рекурсивному варианту.

Вопросы производительности

Варианты с `indirect` размещаются в куче. Для рекурсивных структур, критичных к производительности, рассмотрите использование класса или представления на основе массива со ссылками.

Когда использовать непрямые перечисления

Подходящие случаи: • Связанные списки и функциональные структуры данных • Абстрактные синтаксические деревья (для анализаторов и калькуляторов) • Иерархии файловой системы • Представления деревьев JSON/XML Избегайте этого подхода, когда плоские представления на основе массивов лучше используют кэш.

Быстрая проверка

Что `indirect` добавляет к варианту перечисления?

Итоги

Основные выводы: • `indirect enum` или `indirect case` позволяют создавать рекурсивные типы • Они нужны, потому что рекурсивные типы-значения имели бы бесконечный размер • Используйте их для связанных списков, деревьев и абстрактных синтаксических деревьев • Обход выполняется с помощью рекурсивных функций и `switch` • `indirect` для отдельного варианта точнее, чем `indirect` для всего перечисления Далее: моделирование конечных автоматов с помощью перечислений.
Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

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

Урок «Косвенные перечисления и рекурсивные структуры» бесплатный?

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

Чему я научусь в уроке «Косвенные перечисления и рекурсивные структуры»?

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

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

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

Сколько времени занимает урок «Косвенные перечисления и рекурсивные структуры»?

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

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

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

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

  1. Исходные значения и CaseIterable
  2. Связанные значения для сложных данных
  3. Косвенные перечисления и рекурсивные структуры
  4. Моделирование конечных автоматов с помощью перечислений
← Назад к Swift Academy