目标C - 的NSMutableSet独特的对象属性(Objective c - NSMutabl

2019-06-24 10:11发布

在我的应用我有一类PersonpersonId财产。
现在我需要一些数据结构来保存一堆独特的Person对象(唯一不同= PERSONID)

所以我想我应该使用的NSMutableSet作为我的数据结构,但我怎么做的NSMutableSet比较personId增加一个人的时候属性(所以我不会加入同一人更多然后的)?

我的目标是具有独特个人所有的时间(即使我添加两个人具有相同ID),我想了的NSMutableSet会做所有的辛勤工作,我和集合,如果我加入一个已经存在的人它不会增加它的两倍。

Answer 1:

您可以通过了解如何比较所做出做到这一点NSSet 。 当您添加一个新的对象来设定, isEqual:方法调用(这是一个NSObject方法),对每个组的元素。 所以你可以做的是覆盖此方法,并提供这样一个自定义的比较:

注意:

如果重写isEqual:方法,你必须重写hash方法以及

// In your Person.m
- (BOOL)isEqual:(id)anObject
{
    return [self.personId isEqual:anObject.personId]; 
    // If it's an object. Otherwise use a simple comparison like self.personId == anObject.personId
}

- (NSUInteger)hash
{
    return self.personId; //Must be a unique unsigned integer
}


Answer 2:

我想你想要的是一个NSMutableDictionary ,映射personIdPerson对象。

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

Person *person = something;
[dict setObject:personObj forKey:[NSNumber numberWithInt:[person personId]]];
... etc ...

(不要忘记释放dict后面的某处)。

为了找到Person指定类personId (12,说),你可以简单地这样做:

Person *person = [dict objectForKey:[NSNumber numberWithInt:12]];

注意:您要同时存储键和值对象(你不能保存基本类型)。



Answer 3:

你不应该需要担心这个,当你将项目添加到一个数组。 只要你每次加一个唯一的对象,该对象的属性不应该的问题。

如果你担心这一点,并希望加倍肯定,使用的NSMutableSet代替(除非你需要维护每个对象的顺序)。

更新

你可以使用一个谓词来检查具有相同值的对象,不添加它之前存在。 这将很好地工作两者的NSMutableArray和的NSMutableSet。

//create array
NSMutableArray *array = [[NSMutableArray alloc] init];

//create person
Person *newPerson = [[Person alloc] init];

//add person
[array addObject:newPerson]

//check new object exists
if([[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"personID == %@", [newPerson personID]]] count] == 0)
{
    //add object
    [array addObject:newPerson];
}

很粗糙的伪代码,但希望你得到的要点:)



文章来源: Objective c - NSMutableSet unique object property