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.