2012-11-20 13 views
12

In Fondazione, se voglio convertire un set a un NSArray, posso usare:Array dal set: perché NSSet usa allObjects, mentre NSOrderedSet usa array?

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

Perché questi diverso?

+5

causa NSSet non è ordinato in modo tuttoObject significa che non verrà ordinato, è casuale, ma NSOrderedSet è una matrice alternativa. "È possibile utilizzare insiemi ordinati come alternativa agli array quando l'ordine degli elementi è importante e le prestazioni nel verificare se un oggetto è contenuto nell'insieme è una considerazione: il test per l'appartenenza a un array è più lento rispetto al test per l'appartenenza a un set. " – Dave

+0

@Dave Credo che sia la risposta. Metti su. – CodaFi

+0

Ma con una logica simile si potrebbe chiedere perché il metodo sia chiamato -set, non -unorderedSet o -allObjects? –

risposta

14

speculazione, ma:

Perché quando NSSet è stato creato l'unico altro tipo di raccolta principale è stato NSArray, che era (ed è ancora, in gran parte) il tipo di raccolta più comune. Quindi un metodo chiamato "allObjects" restituirebbe ovviamente un NSArray.

Quando NSOrderedSet è stato aggiunto molto più di recente, ha dovuto gestire l'esistenza di raccolte precedenti, principalmente NSArray e NSSet. Quindi un metodo "allObjects" sarebbe ambiguo. Ergo ha due metodi, -array e -set.

E/o, i metodi -array e -set restituiscono i proxy a quelle che sono probabilmente le stesse classi o classi simili utilizzate internamente. Quindi in senso funzionale sono un po 'diversi - quei proxy vedranno le mutazioni apportate al NSOrderedSet originale. -allObjects d'altra parte no - crea veramente una matrice indipendente, dal momento che la sua memoria interna è probabilmente un hashtable o simile che non è prontamente proxy.

+0

Ottime speculazioni, non ci ho pensato 1. Selezionerò questo quando non c'è niente di meglio I commenti di Dave non sono buoni come questo –

+0

Anche la risposta di Dave è plausibile: –

1

Inoltre ... L'NSArray restituito da "allObjects" è una copia dei valori nel set.

Ma il NSArray restituito da 'array' è un proxy degli oggetti nel set.

Pertanto, se si modifica il valore di qualsiasi oggetto nell'insieme, verrà modificato il valore dell'oggetto nell'array. Una copia del set ordinato non viene eseguita. Quindi le due proprietà hanno nomi diversi perché fanno cose diverse.

+0

Accetto gentilmente, ma il tuo secondo paragrafo dovrebbe probabilmente leggere qualcosa del tipo "Ma il NSArray restituito da 'array' è un proxy del set originale, e se il set originale cambia, l'array proxy cambierà con esso." –

+0

Sì, Clay, sono d'accordo! – OmniB

4

Mentre ci sono altre differenze †, .allObjects non implica un ordinamento preciso, e .array sì; ed è esattamente quello che stai ricevendo.


.array restituisce un proxy dal vivo del sottostante NSOrderedSet, e se il sottostante insieme ordinato cambiamenti, il proxy cambierà con esso.

+0

Grazie! Che cosa significa esattamente? Che l'array restituito del NSOrderedSet sottostante sia collegato con il set ordinato, quindi una modifica nell'array o nel set ordinato si rifletterà nell'altro "Un proxy è un po 'come un intermediario se non sbaglio." Che implicazioni ha qui? Ho provato a riordinare l'array, ma l'ordine non si rifletteva nel set ordinato almeno: P –

+1

'.array' restituisce un 'NSArray', che è di sola lettura, e non dovresti essere in grado di cambiarlo direttamente.Se crei un' mutableCopy', che è una copia, staccato dall'originale nella maggior parte dei modi.Per riordinare, dovresti farlo in un 'NSMutableOrderedSet' sottostante. Le modifiche presumibilmente verranno mostrate nell'array, ma non l'ho mai testato. –