很快就失败了
struct Node {
var val: String
var parent: Node
}
Run Code Online (Sandbox Code Playgroud)
出现错误错误:值类型“Node”不能具有递归包含它的存储属性
但这有效
struct Node {
var val: String
var parent: [Node]
}
Run Code Online (Sandbox Code Playgroud)
这种行为背后的原因是什么?
dav*_*ynn 19
基本上,结构体不能具有属于其自身类型的属性,因为结构体是值类型。这意味着每次使用它时,它都是一个新的副本 - 按值计算。编译器的工作方式是,它需要计算结构在内存中的设定大小。另一方面,从这个意义上讲,类更加灵活。数组稍微复杂一些——它是对象的结构包装器。编译器可以处理结构中未知的数组大小,但无法处理其中可能具有无限递归值的自定义对象。每个节点可以有一个节点与另一个节点,与另一个节点,等等......它需要为结构设置无限内存。有关更多详细信息,请参阅这篇优秀文章: 在 Swift 中使用值类型的双向关联
小智 8
此编译错误的原因是内存分配:-
\n值类型是固定结构,它们在内存、寄存器和堆栈中占据固定空间,具体取决于其大小。该空间是由类型预先确定的,并且必须在编译时已知。
\n因此,编译器需要知道为给定的结构值保留多少空间。但是,如果该值可以包含另一个相同类型的值,并且该值可以包含另一个值,依此类推\xe2\x80\xa6(递归),那么如何计算该空间呢?
\n无法计算所需的空间,因此编译器简单地说 N0!
\n