¿El método addObject de NSMutableSet reemplaza un duplicado o ignora la inserción?

Estoy luchando para determinar si agregar un object ya existente a un set en Cocoa reemplaza realmente el object o simplemente ignora addObject: si hay un duplicado. Estoy usando un object personalizado que se considera igual que otro object si un campo específico es igual.

Estoy reemplazando both isEqual: y hash methods y containsObject: devuelve true cuando lo llamo, pero me gustaría actualizar el set con el nuevo object y, por alguna razón, no funciona si addObject:

Si lo ignora, ¿cuál sería la mejor estructura de datos para usar en lugar de NSMutableSet para tener el efecto deseado?

NSMutableSet 's -addObject: method no agregará un object que pase el -member: test, como tal, no hace nada.

Si aún desea actualizar el set con el nuevo object independientemente, puede usar un NSMutableArray , en el que llamaría -replaceObjectAtIndex:withObject: ::

 @interface NSMutableArray(JRAdditions) - (void)addUniqueObject:(id)object; @end @implementation NSMutableArray(JRAdditions) - (void)addUniqueObject:(id)object { NSUInteger existingIndex = [self indexOfObject:object]; if(existingIndex == NSNotFound) { [self addObject:object]; return; } [self replaceObjectAtIndex:existingIndex withObject:object]; } @end 

De la descripción , ignora si hay un duplicado.

Añade un object determinado al set, si aún no es miembro.

Puede convertir el NSMutableSet en un CFMutableSet, que tiene methods que permiten un mayor control sobre cómo agregar objects (desea CFSetSetValue):

  • CFSetSetValue : el valor que se establecerá en el set . Si este valor ya existe en el Conjunto , se reemplaza.

  • CFSetAddValue : si el valor ya existe en la colección, esta function vuelve sin hacer nada.

  • CFSetReplaceValue : Si este valor aún no existe en el Conjunto , la function no hace nada.

Regresa sin hacer nada. NSMutableSet es un puente gratuito a CFMutableSet , y de los docs para esa class :

Si el valor ya existe en la colección, esta function vuelve sin hacer nada.

Lo siento, pero te estás perdiendo la idea de "igualdad". Si necesita agregar un object a un set porque es diferente, entonces el operador "es igual" debe devolverlo, es diferente. La ÚNICA hora válida para replace un object en un set sería si fuera completamente idéntica. Semántica de set básico. Lo que está describiendo no es un set si está intentando replace un object por un object diferente. Ese es un tipo diferente de colección codificada. Probablemente sugeriría que el más lógico sea un dictionary básico. key = valor Entonces, simplemente asigna el dictionary ["objectId"] = object y, naturalmente, agregará o replaceá. Debe usar la herramienta adecuada para el trabajo.