はじめに、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
}
indirect
キーワードは、舞台裏で間接的なレイヤーを導入します。
列挙ケースが再帰的であることを示すには、その前に間接書き込みを行います。これは、コンパイラに必要な間接化レイヤーを挿入するよう指示します。
ここ から
構造体と列挙型の重要な部分は、それらが一定のサイズであることです。再帰の構造体または列挙型を直接許可すると、再帰の数が不定になり、サイズが一定ではなく予測不能になるため、これに違反します。 indirect
は、一定サイズの参照を使用して、一定サイズの構造体を参照します。
表示する2つのコードスニペットには違いがあります。
最初のコードはBinaryTree<T>
使用されるすべての場所で参照によって保存されます。
2番目のコードはBinaryTree<T>
は、node
の場合にのみ参照によって保存されます。つまりBinaryTree<T>
は、通常、明示的にindirect
node
の場合を除いて、その値を直接保存します。