Swift结构类型的递归值

Dar*_*una 6 recursion struct swift

结构在Swift中不能具有递归值类型.所以后面的代码无法在Swift中编译

struct A {
    let child: A
}
Run Code Online (Sandbox Code Playgroud)

值类型不能递归,因为它将具有无限大小.但我想知道为什么以下代码可以编译?

struct A {
    let children: [A]
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*tti 8

我认为这是关于所需的空间。

无限空间

创建这种类型的值

struct A {
    let child: A
}
Run Code Online (Sandbox Code Playgroud)

我们需要

  • 当前结构的空间
  • 孩子的空间
  • 孩子的孩子的空间
  • ...

所以我们需要无限空间

有限空间

另一方面创造这个价值

struct A {
    let children: [A]
}
Run Code Online (Sandbox Code Playgroud)

我们只需要

  • 的空间 A
  • 空的空间Array


Sul*_*han 6

数组不直接保存其值.数组本质上是一个结构,它保存对包含项的外部内存块的引用.因此,所有阵列占用相同数量的内存,并且在结构中使用它们没有问题.

展示:

struct Value {
    var array: [Int] = [] 
}

var value = Value()
value.array = [0, 1, 2, 3]  // this won't increase the size of the struct!
Run Code Online (Sandbox Code Playgroud)

如果数组的行为不同,您将无法动态更改其大小(例如追加元素)或使用其写时复制行为.本质上,数组和字典是包含在值类型中的类.

因此,您的代码可以编译,因为它不是真正的递归.


ff1*_*f10 2

由于 child[] 可以为空,因此没有理由这不起作用。这编译得很好:

\n\n
struct Foo {\n  let child: [Foo]\n}\n\nlet foo = Foo(child: [Foo(child:[Foo(child:[]), Foo(child:[])])])\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然我没有看到它有任何实际用途 \xe2\x80\x93 但我想知道是否有。

\n