Swift结构体类型递归

17

为什么Swift中结构体不能有递归值类型?这是语言的临时限制还是意料之中的吗?

我认为将二叉树节点声明为具有递归类型的结构体是最自然的实现方式。

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

4
首先,您需要了解引用类型和值类型之间的区别。在大多数语言中,您所写的是不可能的。例如,在C / Obj-C / C ++中,leftNoderightNode必须是指针。在Swift中,如果您想使用引用,请改用class而不是struct。另外请注意,您可能需要使用可选项(optionals)。 - Sulthan
2个回答

26

答案就在你的问题里:结构体是值类型。如果你把一个子结构体 B 包含在一个结构体 A 里面,那么意味着一个 A 类型的对象将会有一个大小为 sizeof(all_other_fields_of_A) + sizeof(B) 的尺寸。所以,一个值类型不能是递归的: 否则它将具有无限大小。


1
仅供参考:关键在于理解值类型,正如@Sulthan所解释的那样。 - Leonardo Marques

8

在Swift中,枚举类型支持使用indirect关键字的递归类型,因此您可以执行以下操作:

indirect enum Tree<T> {

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

}

请看这篇很棒的博客文章 使用间接枚举在Swift中创建持久化树


1
我知道这种方法,但它的持久性是我想避免的事情。 - Leonardo Marques

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接