Вопрос проверяет понимание value semantics в Swift и принципов размещения данных в памяти.
Обычный enum в Swift является value type, поэтому его размер должен быть известен заранее. Это необходимо для корректного размещения значений на стеке или внутри других типов. Если размер нельзя определить, компилятор не сможет выделить память. Именно поэтому рекурсивные enum требуют использования indirect.
Swift строго контролирует работу с памятью для value types, к которым относятся enum, struct и tuple.
Определение: размер типа — это количество байт, которое требуется для хранения одного значения этого типа в памяти.
Для enum это особенно критично, потому что:
он может храниться на стеке
он может быть частью struct
он может копироваться целиком
Перед началом выполнения программы компилятор:
анализирует все cases
определяет максимальный размер associated values
добавляет служебные данные (tag)
В итоге создаётся фиксированный memory layout.
Если размер нельзя вычислить:
Невозможно выделить память
Нельзя корректно копировать значение
Нельзя встроить enum в другой value type
Рекурсивный enum без indirect нарушает все эти правила.
Классы:
являются reference types
всегда имеют фиксированный размер ссылки
реальные данные хранятся в heap
Поэтому рекурсия для них допустима без дополнительных указаний.
Любой обычный enum обязан иметь известный размер на этапе компиляции, иначе Swift не сможет гарантировать корректную и безопасную работу с памятью.