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
}