如何使用 Swift 2.0 声明递归枚举

How to declare recursive enums with Swift 2.0

我正在尝试在 Swift 2 中使用递归枚举,但是我遇到了编译错误。

我开始尝试定义我自己的示例:

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

但是报错:"Consecutive declarations on a line must be separated by :".

因此,我从他们的 WWDC15 Swift 演示文稿中尝试了 Apple 自己的示例:

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

但它也有同样的编译错误。如果我创建一个新的 playground 并将这些行粘贴进去,则会导致错误 - 请参阅屏幕截图,或者如果在 Xcode 项目中有同样的事情,请参阅其他屏幕截图。

我正在使用 Xcode 7.0。

为什么我连 Apple 的例子都无法编译?

根据 release notes,在 Xcode 7 beta 4 中添加了对此的支持,其中指出:

Enums and cases can be marked indirect, which causes the associated value for the enum to be stored indirectly, allowing for recursive data structures to be defined.

以下代码适用于 Playground:

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 无法使用.我不确定这是否与枚举特别相关或只是一般的 beta 不稳定。


背景:

最初提出这个问题并接受这个答案时,Xcodebeta1 是最新版本。 Xcode 7 beta1—beta3 不支持这个,他们的发行说明包含以下措辞:

“indirect” enum elements are not yet implemented yet in this beta, they will be added in a later update.