it-swarm-ja.com

Swift String、Array、Dictionaryのような値の型は内部的にクラスを含む

私は見ていた WWDCビデオ と彼らが話すとき理解できない

これらのプロパティはすべて値型ですが、内部的には、内部データの有効期間を管理するために使用されるクラスが含まれています。

上記の点について彼の理解を共有できる人がいますか?.

3
Maddy

StringArray、およびDictionaryはすべて(スタックに格納される)構造体ですが、動的にサイズが設定された「コンテンツ」は、スタックに割り当てられたバッファーに格納されます。このバッファは、構造体によって参照されるオブジェクトの一部です。

たとえば、 ソースコードがGitHub で利用できるArrayを使用します(Swiftプログラミング言語の他の部分と同様) 。Array構造体に単一のメンバーが含まれていることがわかります:_internal var _buffer: _Buffer_。Arrayの場合、この__Buffer_タイプは、いずれかの__ArrayBuffer<Element>_のtypealiasです(Objective Cランタイムが使用されている場合、 NSArray)、または__ContiguousArrayBuffer<Element>_との高速なブリッジング。

__Buffer_オブジェクトをこのような構造体(Array)でラップすると、Arrayでコピーオンライト動作が可能になります。 Arrayのコピーは、単純に__buffer_参照をソース配列から宛先配列にコピーするだけで非常に安価に作成できます。変更可能な操作が完了すると、Arrayは、その__buffer_が一意に参照されているかどうかを確認します(つまり、他のArrayが同じ_buffer`を共有していない)。

  • 一意に参照されている場合は、別のArrayを意図せずに変更することなく、__buffer_で変更可能な操作を直接実行できます(この__buffer_を共有する他のArrayがないため)。
  • 一意に参照されていない場合は、コピーが作成され、そのコピーに対して変更可能な操作が実行されます。