2010-11-05 9 views

risposta

28

risposta See Rudolph

La mia vecchia risposta qui sotto è ormai superata ed è stato per un po '. Il riferimento di Rudoph a NSOrderedSet/NSMutableOrderedSet è quello corretto in quanto queste classi sono state aggiunte dopo questo Q e il mio A.

Vecchio risposta

Come ha detto Richard, NSMutableSet funziona bene ma solo se non è necessario mantenere una raccolta ordinata. Se fai bisogno di un insieme ordinato un semplice controllo dei contenuti è il meglio che si può fare:

if (![myMutableArray containsObject:newObject]) 
    [myMutableArray addObject:newObject]; 

aggiornamento sulla base di un commento

Puoi avvolgere questo in un metodo come -addUniqueObject: e metterlo in un NSMutableArray category.

+1

Inoltre, come nota aggiuntiva: non è possibile creare una sottoclasse di NSMutableArray per aggiungere questa funzionalità come NSMutableArray è un cosiddetto cluster di classi: quando si esegue '[[NSMutableArray alloc] init]' (o qualsiasi variazione) si non otterrà un'istanza di NSMutableArray ma di qualche classe concreta che implementa la stessa interfaccia. – DarkDust

+1

Ecco a cosa servono le categorie. :-) Ho una tale categoria per -addUniqueObject: su NSMutableArray. http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Articoli/ocCategories.html # // apple_ref/doc/uid/TP30001163-CH20-SW1 –

+1

Vedi sotto la risposta di Rudolf per un approccio più moderno che al momento non esisteva Ho risposto a questo. –

5

Usa NSMutableSet, è meglio per queste situazioni

iOS Reference

Mac OSX Reference

+1

@ Yar: Questa è un'enorme ipotesi. NSMutableSet non è certamente la "classe giusta" se si desidera mantenere una raccolta * ordinata * (senza aggiungere una proprietà aggiuntiva a qualsiasi oggetto modello che si desidera contenere nell'insieme solo per l'ordinamento). –

+0

@Joshua Nozzi, buon punto, se hai bisogno di ordinare, hai bisogno di un array. –

+1

È possibile utilizzare entrambi, 'NSMutableSet' per query di appartenenza efficienti e' NSMutableArray' per il mantenimento dell'ordine di inserimento. Dovrebbe essere facile incapsulare sia in una singola classe "OrderedSet" (se hai come target Lion, c'è già "NSOrderedSet" per questo scopo). – omz

18

Più risposta 2012-ish (in caso qualcuno imbatterci in questo in futuro):

Usa NSOrderedSet e NSMutableOrderedSet.

Una nota sulle prestazioni direttamente dal NSOrderedSet documenti:

È possibile utilizzare insiemi ordinati in alternativa agli array quando l'ordine degli elementi è importante e prestazioni nei test se un oggetto è contenuto nel set è un considerazione- test per l'appartenenza a un array è più lento di test per l'appartenenza a un set.

+0

Buon aggiornamento. :-) –

Problemi correlati