2010-11-05 13 views

Respuesta

28

Véase la respuesta de Rudolph

Mi viejo respuesta a continuación se ha quedado desfasado y ha sido durante un tiempo. La referencia de rudoph a NSOrderedSet/NSMutableOrderedSet es el correcto ya que estas clases se añadieron después de este Q y mi A.

respuesta Antiguo

Como dijo Richard, NSMutableSet funciona bien, pero sólo si no es necesario mantener una colección ordenada Si hace necesitan una colección ordenada de una simple comprobación de contenido es lo mejor que puede hacer:

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

Actualización basada en comentario

Usted puede envolver esto en un método como -addUniqueObject: y lo puso en un NSMutableArray category.

+1

Además, como nota adicional: no es posible crear una subclase de NSMutableArray para agregar esta funcionalidad, ya que NSMutableArray es un llamado cluster de clases: cuando haces '[[NSMutableArray alloc] init]' (o cualquier variación), no obtendrá una instancia de NSMutableArray sino de una clase concreta que implemente la misma interfaz. – DarkDust

+1

Para eso están las categorías. :-) Tengo una categoría para -addUniqueObject: en NSMutableArray. http://developer.applecom/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Articles/OcCategories.html # // apple_ref/doc/uid/TP30001163-CH20-SW1 –

+1

Consulte la respuesta de Rudolf a continuación para obtener un enfoque más moderno que no existía en ese momento Yo respondí esto. –

5

Uso NSMutableSet, es mejor para estas situaciones

iOS Reference

Mac OSX Reference

+1

@Yar: Es una gran suposición que usted llegó allí. NSMutableSet ciertamente no es la "clase correcta" si desea mantener una colección * ordenada * (sin agregar una propiedad adicional a los objetos de modelo que desea contener en el conjunto solo para ordenar por). –

+0

@Joshua Nozzi, buen punto, si necesita ordenar, necesita una matriz. –

+1

Puede usar ambos, 'NSMutableSet' para consultas de membresía eficientes y' NSMutableArray' para mantener el orden de inserción. Debería ser fácil encapsular ambos en una sola clase "OrderedSet" (si se dirige a Lion, ya existe 'NSOrderedSet' para este fin). – omz

18

Más respuesta 2012-ish (en caso de que alguien se topó con esto en el futuro):

Uso NSOrderedSet y NSMutableOrderedSet.

Una nota sobre el desempeño adecuado de NSOrderedSet docs:

Puede utilizar conjuntos ordenados como una alternativa a las matrices cuando el orden de los elementos es importante y el rendimiento en las pruebas de si un objeto está contenido en el conjunto es una consideración- las pruebas de membresía de una matriz son más lentas que las pruebas de membresía de un conjunto.

+0

Buena actualización. :-) –

Cuestiones relacionadas