为什么Swift中结构体不能有递归值类型?这是语言的临时限制还是意料之中的吗?
我认为将二叉树节点声明为具有递归类型的结构体是最自然的实现方式。
struct TreeNode<E>{
var leftNode:TreeNode<E>
var rightNode:TreeNode<E>
var element:E
}
答案就在你的问题里:结构体是值类型。如果你把一个子结构体 B
包含在一个结构体 A
里面,那么意味着一个 A
类型的对象将会有一个大小为 sizeof(all_other_fields_of_A) + sizeof(B)
的尺寸。所以,一个值类型不能是递归的: 否则它将具有无限大小。
在Swift中,枚举类型支持使用indirect
关键字的递归类型,因此您可以执行以下操作:
indirect enum Tree<T> {
case Node(left: Tree?, right: Tree?, element: T)
}
请看这篇很棒的博客文章 使用间接枚举在Swift中创建持久化树
leftNode
和rightNode
必须是指针。在Swift中,如果您想使用引用,请改用class
而不是struct
。另外请注意,您可能需要使用可选项(optionals)。 - Sulthan