间接的枚举和结构

时间:2016-05-30 20:07:37

标签: swift struct enums

首先,我想说我知道在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
}

1 个答案:

答案 0 :(得分:46)

indirect关键字在幕后引入了一层间接。

  

通过在其之前写入indirect来表示枚举大小写是递归的,告诉编译器插入必要的间接层

来自here

结构和枚举的重要部分是它们的大小不变。直接允许递归结构或枚举会违反这一点,因为会有不确定数量的递归,因此使得大小不恒定且不可预测。 indirect使用常量大小引用来引用常量大小的结构。

您展示的两个代码段之间存在差异。

  1. 第一段代码会使BinaryTree<T>存储在所使用的任何地方。

  2. 第二段代码仅在BinaryTree<T>的情况下通过引用存储node。即BinaryTree<T>通常会直接存储其值,但明确indirect node的情况除外。