Swift中的递归枚举的奇怪行为(Beta 7)

Sam*_*Sam 4 swift

enum Tree{
    case Leaf(String)
    case Node(Tree)
} //compiler not happy!!

enum Tree{
    case Leaf(String)
    case Node([Tree])
} //compiler is happy in (arguably) a more complex recursive scenario?
Run Code Online (Sandbox Code Playgroud)

Swift编译器如何为第二个(更复杂的)场景工作而不是第一个?

mpo*_*nik 10

值得注意的是Swift 2 beta 2并且还具有indirect递归枚举的关键字 - 这意味着

enum Tree<T> {
    case Leaf(T)
    indirect case Node(Tree)
}
Run Code Online (Sandbox Code Playgroud)

是有效的语言构造,不会破坏Swift 2中的模式匹配.

TL;决策的DR:"[...]我们认为正确的解决方案是不通过枚举来支持一般的,非显而易见的递归,并要求程序员明确地用间接调解."



new*_*cct 3

值类型(枚举)不能包含自身作为直接成员,因为无论数据结构有多大,它都不能包含自身。显然,枚举案例的关联数据被视为枚举的直接成员,因此关联数据不能是枚举本身的类型。(实际上,我希望他们能让递归枚举发挥作用;这对于函数式数据结构来说非常有用。)

然而,如果你有一定程度的间接性,那就没问题了。例如,关联数据可以是对象(类的实例),并且该类可以具有枚举成员。由于类类型是引用类型,它只是一个指针,并不直接包含对象(因此也包含枚举),所以没关系。

你的问题的答案是:[Tree]不包含Tree直接作为会员。的字段Array是私有的,但我们通常可以推断数组元素的存储不会直接存储在结构体中Array,因为对于给定的结构体具有固定的大小Array<T>,但数组可以具有无限数量的元素。