我正在努力弄清楚是否将一个已经存在的对象添加到 Cocoa 中的集合实际上会替换该对象,或者addObject:
如果有重复则只是忽略。如果特定字段相等,我正在使用一个被认为与另一个对象相同的自定义对象。
我同时覆盖了isEqual:
和hash
方法,并且在调用它时containsObject:
确实返回true
了,但是我想用新对象更新集合,由于某种原因,如果我调用addObject:
.
NSMutableSet
如果它确实忽略了它,为了达到预期的效果,最好的数据结构是什么?
我正在努力弄清楚是否将一个已经存在的对象添加到 Cocoa 中的集合实际上会替换该对象,或者addObject:
如果有重复则只是忽略。如果特定字段相等,我正在使用一个被认为与另一个对象相同的自定义对象。
我同时覆盖了isEqual:
和hash
方法,并且在调用它时containsObject:
确实返回true
了,但是我想用新对象更新集合,由于某种原因,如果我调用addObject:
.
NSMutableSet
如果它确实忽略了它,为了达到预期的效果,最好的数据结构是什么?
从描述中,如果有重复,它会忽略。
如果给定对象还不是成员,则将给定对象添加到集合中。
您可以将 NSMutableSet 转换为 CFMutableSet,它具有允许更好地控制如何添加对象的方法(您需要 CFSetSetValue):
CFSetSetValue:要在 theSet 中设置的值。如果该值已存在于theSet中,则将其替换。
CFSetAddValue:如果集合中已经存在值,则此函数不执行任何操作就返回。
CFSetReplaceValue :如果set中不存在此值,则该函数不执行任何操作。
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
它不做任何事情就返回。与该类的文档NSMutableSet
免费桥接:CFMutableSet
如果集合中已经存在值,则此函数不执行任何操作而返回。
对不起,你错过了“平等”的概念。如果您需要将一个对象添加到一个集合中,因为它不同,那么“等于”运算符需要返回它是不同的。替换集合中的对象的唯一有效时间是它完全相同。基本集合语义。如果您试图用不同的对象替换一个对象,那么您所描述的不是一个集合。那是一种不同类型的键控集合。我可能会建议最合乎逻辑的一本是基本字典。键=值。因此,您只需分配字典[“objectId”] = object,它自然会添加或替换。您需要使用正确的工具来完成这项工作。