iOS仅将唯一对象添加到NSMutableOrderedSet

时间:2014-08-30 22:55:26

标签: ios objective-c cocoa-touch

我有一个NSMutableOrderedSet。我下载了一个" Person"对象。每个Person对象都有一个唯一的id。

仅添加尚未包含在NSMutableOrderedSet中的Person对象的最有效方法是什么?

我显然可以遍历整个集合,如果id最终不存在则添加它 - 但这似乎是最慢的方式。

想法?

我在做什么:

for (int x = 0; x < existingSet.Count; x++)
{
  if ([personA isEqualto: personB])
      break;
  if (x == existingSet.Count - 1 && ![person isEqualto: personB])
      [existingSet addObject: personA];

}

1 个答案:

答案 0 :(得分:4)

你必须教你的人类什么是平等意味着什么,因为一个集合只会发现新对象,如果发现它们不等于任何其他对象。通过覆盖isEqual:hash

来完成此操作
@interface Person : NSObject
@property (strong) NSNumber *identifier;
@end

@implementation Person
- (BOOL)isEqual:(id)object {
  return [self.identifier isEqualToNumber: object.identifier];
}

- (NSUInteger)hash {
  return [self.identifier hash]; // if the only field to determine uniqueness is `identifier`, this hashing method is enough
}
@end

比你所要做的只是

[existingSet addObject: personA];

这将导致与

相同的设置
[existingSet addObject: personA];
[existingSet addObject: personA];
[existingSet addObject: personA];
[existingSet addObject: personA];

因为只能添加一个相等的对象。其他addObject:调用将无声地失败。


好读:NSHipster: Equality