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:"[...]我们认为正确的解决方案是不通过枚举来支持一般的,非显而易见的递归,并要求程序员明确地用间接调解."
值类型(枚举)不能包含自身作为直接成员,因为无论数据结构有多大,它都不能包含自身。显然,枚举案例的关联数据被视为枚举的直接成员,因此关联数据不能是枚举本身的类型。(实际上,我希望他们能让递归枚举发挥作用;这对于函数式数据结构来说非常有用。)
然而,如果你有一定程度的间接性,那就没问题了。例如,关联数据可以是对象(类的实例),并且该类可以具有枚举成员。由于类类型是引用类型,它只是一个指针,并不直接包含对象(因此也包含枚举),所以没关系。
你的问题的答案是:[Tree]不包含Tree直接作为会员。的字段Array是私有的,但我们通常可以推断数组元素的存储不会直接存储在结构体中Array,因为对于给定的结构体具有固定的大小Array<T>,但数组可以具有无限数量的元素。
| 归档时间: |
|
| 查看次数: |
1064 次 |
| 最近记录: |