我正在尝试在 Swift 2 中使用递归枚举,但是我遇到了编译错误。
我开始尝试定义我自己的示例:
enum Tree {
case Empty
indirect case Node(value: Int, left: Tree, right: Tree)
}
但是得到一个错误:“一行中连续的声明必须用:分隔”。
因此,我从他们的 WWDC15 What's New in 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 不稳定性。
背景:
最初提出这个问题并接受这个答案时,Xcode beta1 是最新版本。 Xcode 7 beta1—beta3 不支持这一点,他们的发行说明包含以下措辞:
“indirect” enum elements are not yet implemented yet in this beta, they will be added in a later update.
关于ios - 如何使用 Swift 2.0 声明递归枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30967197/