iphone objective-c nsset nsmutableset

iphone - Objective c-propiedad de objeto única NSMutableSet



objective-c nsset (3)

En mi aplicación tengo una Person clase con propiedad personId .
Ahora necesito algo de estructura de datos para contener un montón de objetos Person únicos (unique = different personId)

Entonces, creo que debería usar NSMutableSet como mi estructura de datos, pero ¿cómo puedo hacer que NSMutableSet compare la propiedad personId al agregar una persona (para que no agregue la misma persona más que las otras)?

Mi objetivo es tener una colección de personas únicas todo el tiempo (incluso si agrego dos personas con la misma identificación), quiero que el NSMutableSet haga todo el trabajo por mí y si agrego una persona que ya existe no lo agregará dos veces


Creo que lo que quieres es un NSMutableDictionary , mapeando el personId al objeto Person .

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; Person *person = something; [dict setObject:personObj forKey:[NSNumber numberWithInt:[person personId]]]; ... etc ...

(No te olvides de lanzar dict más tarde en algún lugar).

Para encontrar la clase de Person para el personId Person especificado (12, por ejemplo), simplemente puede hacer:

Person *person = [dict objectForKey:[NSNumber numberWithInt:12]];

Nota: tiene que almacenar la clave y el valor como objetos (no puede almacenar tipos primitivos).


No debería tener que preocuparse por esto cuando está agregando elementos a una matriz. Mientras esté agregando un objeto único cada vez, las propiedades del objeto no deberían importar.

Si está preocupado por esto y desea estar completamente seguro, use NSMutableSet en su lugar (a menos que necesite mantener el orden de cada objeto).

Actualizar

Podría usar un predicado para verificar que no existe un objeto con el mismo valor antes de agregarlo. Esto funcionaría bien tanto con NSMutableArray como con NSMutableSet.

//create array NSMutableArray *array = [[NSMutableArray alloc] init]; //create person Person *newPerson = [[Person alloc] init]; //add person [array addObject:newPerson] //check new object exists if([[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"personID == %@", [newPerson personID]]] count] == 0) { //add object [array addObject:newPerson]; }

Pseudocódigo muy áspero, pero espero que tengas la esencia :)


Puede lograrlo al comprender cómo NSSet realiza la NSSet . Cuando agrega un nuevo objeto al conjunto, se isEqual: método isEqual: (es un método NSObject ) contra cada uno de los elementos del conjunto. Entonces, lo que puede hacer es anular este método y proporcionar una comparación personalizada como esta:

NOTA:

Si reemplaza el método isEqual: también debe reemplazar el método hash

// In your Person.m - (BOOL)isEqual:(id)anObject { return [self.personId isEqual:anObject.personId]; // If it''s an object. Otherwise use a simple comparison like self.personId == anObject.personId } - (NSUInteger)hash { return self.personId; //Must be a unique unsigned integer }