在Swift中,结构体不能具有递归值类型。因此,下面的代码无法在Swift中编译。
struct A {
let child: A
}
值类型不能递归,因为它会具有无限大小。但我想知道为什么以下代码可以编译?
struct A {
let children: [A]
}
数组并不直接保存它的值。数组本质上是一个结构体,它保存对包含项的外部内存块的引用。因此,所有的数组占用相同的内存空间,可以在结构体中使用它们而不会出现问题。
举个例子:
struct Value {
var array: [Int] = []
}
var value = Value()
value.array = [0, 1, 2, 3] // this won't increase the size of the struct!
我认为这与所需空间有关。
要创建此类型的值,
struct A {
let child: A
}
我们需要:
所以,我们需要无限空间。
另一方面,要创建此值:
struct A {
let children: [A]
}
我们只需要:
A
所需的空间Array
所需的空间。由于child[]可以为空,所以这个方法应该是可行的。以下代码可以正常编译:
struct Foo {
let child: [Foo]
}
let foo = Foo(child: [Foo(child:[Foo(child:[]), Foo(child:[])])])
虽然我看不出它有任何实际用途——但我想知道是否有用。
如果你知道一个Node
只会有一个父节点(如果是leaf
),那么你可以使用枚举和indirect case
来实现:
public enum Node<Value> {
case root(value: Value)
indirect case leaf(parent: Node, value: Value)
}
public extension Node {
var value: Value {
switch self {
case .root(let value): return value
case .leaf(_, let value): return value
}
}
}