Как объявить рекурсивные перечисления с помощью Swift 2.0

Я пытаюсь поэкспериментировать с рекурсивными перечислениями в Swift 2, но я получаю ошибки компиляции.

Я начал пытаться определить свой собственный пример:

enum Tree {
    case Empty
    indirect case Node(value: Int, left: Tree, right: Tree)
}

Но получим ошибку: "Последовательные объявления в строке должны быть разделены:".

Итак, я попробовал собственный пример Apple из своей презентации WWDC15 What New in Swift:

enum Tree<T> {
  case Leaf(T)
  indirect case Node(Tree, Tree) 
}

Но это же ошибка компиляции с этим тоже. Если я создаю новую игровую площадку и вставляю эти строки, то она приводит к ошибке - см. Скриншот или если в проекте Xcode то же самое, см. Другой снимок экрана.

Я использую Xcode 7.0.

Почему я не могу даже привести пример Apple?

enter image description hereenter image description here

Ответ 1

В соответствии с примечаниями к выпуску поддержка этого была добавлена ​​в Xcode 7 beta 4, которая гласит:

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

На игровой площадке работает следующий код:

enum Tree {
    case Empty
    indirect case Node(value: Int, left: Tree, right: Tree)
}

let tree1 = Tree.Node(value: 0, left: Tree.Empty, right: Tree.Empty)
let tree2 = Tree.Node(value: 0, left: Tree.Node(value: -1, Tree.Empty, Tree.Empty), right: Tree.Empty)

Анекдотически попытка использования перечисления с switch отлично работала, но с использованием нового синтаксиса Swift 2 if case неоднократно разбивался Xcode и делал Playground непригодным. Я не уверен, связано ли это конкретно с перечислениями или просто с общей бета-нестабильностью.


Фон:

В то время, когда этот вопрос был первоначально задан и этот ответ был принят, Xcode beta1 был последней версией. Xcode 7 beta1-beta3 не поддержал это, и в примечаниях к выпуску содержались следующие формулировки:

"косвенные" элементы перечисления еще не реализованы в этой бета-версии, они будут добавлены в более позднем обновлении.