我正在努力弄清楚是将一个已经存在的对象添加到Cocoa中的集合中是否实际上替换了该对象,或者是否存在重复项而忽略了addObject:。我正在使用一个自定义对象,如果特定字段相等,该对象将被视为与另一个对象相同。

我同时覆盖isEqual:hash方法,并且当我调用containsObject:时,它确实返回true,但是我想用新对象来更新该集合,并且由于某些原因,如果我调用addObject:,它将不起作用。

如果确实忽略了它,那么为了获得所需的效果,将使用哪种最佳的数据结构代替NSMutableSet

最佳答案

NSMutableSet -addObject: 方法不会添加通过-member:测试的对象,因此它不会执行任何操作。

如果仍然无论如何仍要使用新对象更新集合,则可以使用NSMutableArray,在其上调用 -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

10-04 11:53