enum
— это ключевое слово, с помощью которого можно создать перечисление.
Перечисление, в общем случае — это множество связанных между собой значений. Помимо этого перечисления могут содержать свойства и методы.
С помощью конструкции indirect enum
создаются рекурсивные перечисления, то есть такие перечисления, члены которых которые могут ссылаться на данное перечисление.
В качестве пример можно привести перечисление Node
// Рекурсивное перечисление, описывающее Узел // который может быть либо Конечным, либо иметь связь с другими узлами // Таким образом создается некий аналог структуры данных "Дерево" indirect enum Node<T> { case endPoint( item: T ) case linkedPoint( item: T, childs: [Node] ) } let son = Node.endPoint(item: "Matwey") let daughter = Node.endPoint(item: "Helga") let mother = Node.linkedPoint(item: "Jane", childs: [son, daughter]) let father = Node.linkedPoint(item: "Alex", childs: [son, daughter]) let grandma = Node.linkedPoint(item: "July", childs: [mother])
Хочу обратить внимание, что ключевое слово indirect можно использовать не для всего перечисления, а только для того, которое содержит ссылку на другой элемент данного перечисления.
enum Node<T> { case endPoint( item: T ) indirect case linkedPoint( item: T, childs: [Node] ) }
Дело в том, что indirect enum
— это reference type, а не value type, как обычный enum
.