20

Foundationでは、セットをに変換する場合はNSArray、次を使用できます。

  • -[NSSet allObjects]
  • -[NSOrderedSet array]

なぜこれらは違うのですか?

4

3 に答える 3

18

憶測ですが:

NSSetが作成されたとき、他の主要なコレクションタイプはNSArrayだけでした。これは、最も一般的なコレクションタイプでした(そして今でも大部分はそうです)。したがって、「allObjects」と呼ばれるメソッドは明らかにNSArrayを返します。

NSOrderedSetが最近追加されたときは、以前のコレクション(主に、NSArrayとNSSet)の存在に対処する必要がありました。したがって、「allObjects」メソッドはあいまいになります。エルゴには、-arrayと-setの2つのメソッドがあります。

および/または、-arrayメソッドと-setメソッドは、内部で使用されているのと同じまたは類似のクラスである可能性が高いプロキシを返します。したがって、機能的な意味では、それらは少し異なります。これらのプロキシは、元のNSOrderedSetで行われたミューテーションを認識します。一方、allObjectsはそうではありません。内部ストレージはハッシュテーブルなどであり、容易にプロキシされない可能性があるため、純粋に独立した配列を作成します。

于 2012-11-20T07:42:21.583 に答える
5

他にも違いがあります†が.allObjects、明確な順序を意味するのではなく、.arrayそうします。そしてそれはまさにあなたが得ているものです。


†は、基に.arrayなるのライブプロキシを返します。NSOrderedSet基になる順序集合が変更されると、プロキシもそれに合わせて変更されます。

于 2015-03-03T21:08:59.887 に答える
1

また...'allObjects'によって返されるNSArrayは、セット内の値のコピーです。

ただし、「array」によって返されるNSArrayは、セット内のオブジェクトのプロキシです。

したがって、セット内のオブジェクトの値を変更すると、配列内のオブジェクトの値も変更されます。注文したセットのコピーは作成されていません。したがって、2つのプロパティは、動作が異なるため、名前が異なります。

于 2014-11-11T19:08:37.347 に答える