Вопросы по теме «Перечисления»

Что такое enum?

Ответ

enum — это ключевое слово, с помощью которого можно создать перечисление.

Перечисление, в общем случае — это множество связанных между собой значений. Помимо этого перечисления могут содержать свойства и методы.


🔨 Что такое indirect 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 позволяет хранить ссылки на самого себя. Но ведь enum - это value type, как такое становится возможным? Или хранятся не ссылки, а копии значений?

Ответ

Дело в том, что indirect enum — это reference type, а не value type, как обычный enum.