3

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

我同时覆盖了isEqual:hash方法,并且在调用它时containsObject:确实返回true了,但是我想用新对象更新集合,由于某种原因,如果我调用addObject:.

NSMutableSet如果它确实忽略了它,为了达到预期的效果,最好的数据结构是什么?

4

4 回答 4

15

从描述中,如果有重复,它会忽略。

如果给定对象还不是成员,则将给定对象添加到集合中。

您可以将 NSMutableSet 转换为 CFMutableSet,它具有允许更好地控制如何添加对象的方法(您需要 CFSetSetValue):

  • CFSetSetValue:要在 theSet 中设置的。如果该值已存在于theSet中,则将其替换。

  • CFSetAddValue:如果集合中已经存在值,则此函数不执行任何操作就返回。

  • CFSetReplaceValue :如果set中不存在此值,则该函数不执行任何操作。

于 2012-09-28T20:01:12.033 回答
1

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
于 2012-09-28T20:02:06.137 回答
0

它不做任何事情就返回。与该类的文档NSMutableSet免费桥接:CFMutableSet

如果集合中已经存在值,则此函数不执行任何操作而返回。

于 2012-09-28T20:00:25.137 回答
0

对不起,你错过了“平等”的概念。如果您需要将一个对象添加到一个集合中,因为它不同,那么“等于”运算符需要返回它是不同的。替换集合中的对象的唯一有效时间是它完全相同。基本集合语义。如果您试图用不同的对象替换一个对象,那么您所描述的不是一个集合。那是一种不同类型的键控集合。我可能会建议最合乎逻辑的一本是基本字典。键=值。因此,您只需分配字典[“objectId”] = object,它自然会添加或替换。您需要使用正确的工具来完成这项工作。

于 2017-02-01T05:32:59.127 回答