web-dev-qa-db-ja.com

間接列挙型および構造体

はじめに、Swiftのindirectキーワードを参照するSO=]内にmanyの記事と質問があることに気付きました。 。

indirectの使用に関する最も一般的な説明は、再帰的な列挙を許可することです。

indirectで何ができるかを単に知るのではなく、howを使用して再帰的な列挙型を使用できるようにしたいと思います。

質問:

列挙型は値型であり、再帰構造で構築されている場合、値型はうまくスケーリングされないためですか?どうして?

indirectは、参照型のように動作するように値型の動作を変更しますか?

次の2つの例は問題なくコンパイルされます。違いはなんですか?

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
}
44
Kelvin Lau

indirectキーワードは、舞台裏で間接的なレイヤーを導入します。

列挙ケースが再帰的であることを示すには、その前に間接書き込みを行います。これは、コンパイラに必要な間接化レイヤーを挿入するよう指示します。

ここ から

構造体と列挙型の重要な部分は、それらが一定のサイズであることです。再帰の構造体または列挙型を直接許可すると、再帰の数が不定になり、サイズが一定ではなく予測不能になるため、これに違反します。 indirectは、一定サイズの参照を使用して、一定サイズの構造体を参照します。

表示する2つのコードスニペットには違いがあります。

  1. 最初のコードはBinaryTree<T>使用されるすべての場所で参照によって保存されます。

  2. 2番目のコードはBinaryTree<T>は、nodeの場合にのみ参照によって保存されます。つまりBinaryTree<T>は、通常、明示的にindirectnodeの場合を除いて、その値を直接保存します。

47
Alexander