Подтвердить что ты не робот

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

Для начала хочу сказать, что я знаю, что в SO есть много статей и вопросов, которые ссылаются на indirect ключевое слово в Swift.

Наиболее популярным объяснением использования indirect является учет рекурсивных перечислений.

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

Вопросы:

Это потому, что перечисления являются типами значений, а типы значений плохо масштабируются, если они построены в рекурсивной структуре? Зачем?

Изменяет ли indirect поведение типа значения поведение, чтобы оно больше походило на ссылочный тип?

Следующие два примера компилируются просто отлично. В чем разница?

indirect enum BinaryTree<T> {
  case node(BinaryTree<T>, T, BinaryTree<T>)
  case empty
}

enum BinaryTree<T> {
  indirect case node(BinaryTree<T>, T, BinaryTree<T>)
  case empty
}
4b9b3361

Ответ 1

Ключевое слово indirect вводит слой косвенности за кулисами.

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

От здесь

Важная часть структур и перечислений состоит в том, что они являются постоянными. Разрешить рекурсивные структуры или перечисления напрямую нарушали бы это, так как было бы неопределимое количество рекурсий, что делало бы размер неизменным и непредсказуемым. indirect использует ссылку на постоянный размер для ссылки на структуру с постоянным размером.

Здесь есть два разных фрагмента кода.

  • Первая часть кода делает BinaryTree<T> сохраненной ссылкой везде, где она используется.

  • Вторая часть кода делает BinaryTree<T> сохраненной ссылкой только в случае node. То есть BinaryTree<T> обычно имеет значение, хранящееся непосредственно, за исключением этого явно indirect node.