Foundationでは、セットをに変換する場合はNSArray
、次を使用できます。
-[NSSet allObjects]
-[NSOrderedSet array]
なぜこれらは違うのですか?
Foundationでは、セットをに変換する場合はNSArray
、次を使用できます。
-[NSSet allObjects]
-[NSOrderedSet array]
なぜこれらは違うのですか?
憶測ですが:
NSSetが作成されたとき、他の主要なコレクションタイプはNSArrayだけでした。これは、最も一般的なコレクションタイプでした(そして今でも大部分はそうです)。したがって、「allObjects」と呼ばれるメソッドは明らかにNSArrayを返します。
NSOrderedSetが最近追加されたときは、以前のコレクション(主に、NSArrayとNSSet)の存在に対処する必要がありました。したがって、「allObjects」メソッドはあいまいになります。エルゴには、-arrayと-setの2つのメソッドがあります。
および/または、-arrayメソッドと-setメソッドは、内部で使用されているのと同じまたは類似のクラスである可能性が高いプロキシを返します。したがって、機能的な意味では、それらは少し異なります。これらのプロキシは、元のNSOrderedSetで行われたミューテーションを認識します。一方、allObjectsはそうではありません。内部ストレージはハッシュテーブルなどであり、容易にプロキシされない可能性があるため、純粋に独立した配列を作成します。
他にも違いがあります†が.allObjects
、明確な順序を意味するのではなく、.array
そうします。そしてそれはまさにあなたが得ているものです。
†は、基に.array
なるのライブプロキシを返します。NSOrderedSet
基になる順序集合が変更されると、プロキシもそれに合わせて変更されます。
また...'allObjects'によって返されるNSArrayは、セット内の値のコピーです。
ただし、「array」によって返されるNSArrayは、セット内のオブジェクトのプロキシです。
したがって、セット内のオブジェクトの値を変更すると、配列内のオブジェクトの値も変更されます。注文したセットのコピーは作成されていません。したがって、2つのプロパティは、動作が異なるため、名前が異なります。