首先,我想说我知道在SO中有很多文章和问题引用了Swift中的indirect
关键字。
使用indirect
的最流行的解释是允许递归枚举。
我不想仅知道indirect
允许我们做什么,而是想知道如何它允许我们使用递归枚举。
是因为枚举是值类型,如果它们是在递归结构中构建的,则值类型不能很好地扩展吗?为什么呢?
indirect
是否会修改值类型行为以使其更像引用类型?
以下两个例子编译得很好。有什么区别?
indirect enum BinaryTree<T> {
case node(BinaryTree<T>, T, BinaryTree<T>)
case empty
}
enum BinaryTree<T> {
indirect case node(BinaryTree<T>, T, BinaryTree<T>)
case empty
}
答案 0 :(得分:46)
indirect
关键字在幕后引入了一层间接。
通过在其之前写入indirect来表示枚举大小写是递归的,告诉编译器插入必要的间接层。
来自here
结构和枚举的重要部分是它们的大小不变。直接允许递归结构或枚举会违反这一点,因为会有不确定数量的递归,因此使得大小不恒定且不可预测。 indirect
使用常量大小引用来引用常量大小的结构。
您展示的两个代码段之间存在差异。
第一段代码会使BinaryTree<T>
存储在所使用的任何地方。
第二段代码仅在BinaryTree<T>
的情况下通过引用存储node
。即BinaryTree<T>
通常会直接存储其值,但明确indirect
node
的情况除外。