2016-03-18 98 views
4

为什么不能在Swift中使用递归值类型? 这是语言的临时限制还是意图?Swift结构类型递归

我觉得能够将二叉树节点声明为具有递归类型的结构是最自然的实现。

struct TreeNode<E>{ 
var leftNode:TreeNode<E> 
var rightNode:TreeNode<E> 
var element:E 
} 
+2

您需要了解的引用类型和之间的区别值类型第一。你写的东西在大多数语言中是不可能的。例如,在C/Obj-C/C++中,'leftNode'和'rightNode'必须是指针。在Swift中,如果你想使用引用,你应该使用'class'而不是'struct'。另外请注意,您可能需要optionals。 – Sulthan

回答

8

答案在你的问题:结构是值类型。如果在子结构B中包含结构A,这意味着A类型的一个对象的大小将为sizeof(all_other_fields_of_A) + sizeof(B)。所以,一个值类型不能递归:它将具有无限大小。

+1

仅供将来参考:关键是要了解@Sulthan所解释的值类型。 –

4

枚举在使用indirect关键字,所以我们可以这样做雨燕支持递归类型:

indirect enum Tree<T> { 

    case Node(left: Tree?, right: Tree?, element: T) 

} 

检查出这个伟大的博客文章A persistent tree using indirect enums in Swift

+0

我知道这种方法,但它的持久性是我想避免的。 –