objective-c cocoa cocoa-touch object nsset

objective c - Obtener un objeto de un NSSet



objective-c cocoa (7)

NSSet no tiene un método objectAtIndex:

Intenta llamar a todos los objetos que devuelve un NSArray de todos los objetos.

Si no puede obtener un objeto con objectAtIndex: desde un NSSet, ¿cómo recupera los objetos?


NSSet utiliza el método isEqual: (que los objetos que usted pone en ese conjunto deben anular, además, el método hash) para determinar si un objeto está dentro de él.

Entonces, por ejemplo, si tiene un modelo de datos que define su unicidad por un valor de id (digamos que la propiedad es:

@property NSUInteger objectID;

entonces implementarías isEqual: como

- (BOOL)isEqual:(id)object { return (self.objectID == [object objectID]); }

y podrías implementar hash:

- (NSUInteger)hash { return self.objectID; // to be honest, I just do what Apple tells me to here // because I''ve forgotten how Sets are implemented under the hood }

Luego, puede obtener un objeto con esa identificación (así como verificar si está en el NSSet) con:

MyObject *testObject = [[MyObject alloc] init]; testObject.objectID = 5; // for example. // I presume your object has more properties which you don''t need to set here // because it''s objectID that defines uniqueness (see isEqual: above) MyObject *existingObject = [mySet member: testObject]; // now you''ve either got it or existingObject is nil

Pero sí, la única manera de obtener algo de un NSSet es considerar lo que define su singularidad en primer lugar.

No he probado lo que es más rápido, pero evito usar la enumeración porque podría ser lineal, mientras que usar el método member sería mucho más rápido. Esa es una de las razones para preferir el uso de NSSet en lugar de NSArray.


Para Swift3 y iOS10:

//your current set let mySet : NSSet //targetted index let index : Int //get object in set at index let object = mySet.allObjects[index]


es posible usar filtradoSetUsingPredicate si tiene algún tipo de identificador único para seleccionar el objeto que necesita.

Primero crea el predicado (suponiendo que tu identificación única en el objeto se llama "identificador" y es un NSString):

NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"identifier == %@", identifier];

Y luego elige el objeto usando el predicado:

NSObject *myChosenObject = [mySet filteredSetUsingPredicate:myPredicate].anyObject;


NSArray *myArray = [myNSSet allObjects];

MyObject *object = [myArray objectAtIndex:(NSUInteger *)]

reemplace NSUInteger con el índice de su objeto deseado.


Hay varios casos de uso para un conjunto. Puede enumerar (por ejemplo, con enumerateObjectsUsingBlock o NSFastEnumeration), invocar containsObject para probar la membresía, usar anyObject para obtener un miembro (no aleatorio) o convertirlo en una matriz (sin ningún orden en particular) con allObjects .

Un conjunto es apropiado cuando no desea duplicados, no le importa el orden y desea una prueba de membresía rápida.


for (id currentElement in mySet) { // ** some actions with currentElement }