我正在努力弄清楚是将一个已经存在的对象添加到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