Объект c - уникальное свойство объекта NSMutableSet
В моем приложении у меня есть класс Person
с свойством personId
.
Теперь мне нужна некоторая структура данных, чтобы содержать кучу уникальных объектов Person
(unique = different personId)
Итак, я предполагаю, что я должен использовать NSMutableSet в качестве моей структуры данных, но как заставить NSMutableSet сравнить свойство personId
при добавлении человека (поэтому я не буду добавлять того же человека больше, чем те)?
Моя цель состоит в том, чтобы постоянно иметь коллекцию уникальных людей (даже если я добавляю двух человек с одинаковым идентификатором), я хочу, чтобы NSMutableSet выполнял всю тяжелую работу для меня, и если я добавляю человека который уже существует, он не будет добавлять его дважды.
Ответы
Ответ 1
Вы можете достичь этого, понимая, как производится сравнение с помощью NSSet
.
Когда вы добавляете новый объект в набор, метод isEqual:
вызывается (это метод NSObject
) для каждого из заданных элементов. Итак, что вы можете сделать, это переопределить этот метод и предоставить собственное сравнение, подобное этому:
ПРИМЕЧАНИЕ.
Если вы переопределите метод isEqual:
, вы должны переопределить метод hash
, а также
// In your Person.m
- (BOOL)isEqual:(id)anObject
{
return [self.personId isEqual:anObject.personId];
// If it an object. Otherwise use a simple comparison like self.personId == anObject.personId
}
- (NSUInteger)hash
{
return self.personId; //Must be a unique unsigned integer
}
Ответ 2
Я думаю, что вы хотите NSMutableDictionary
, сопоставляя personId
с объектом Person
.
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]];
Примечание: вы должны хранить как ключ, так и значение как объекты (вы не можете хранить примитивные типы).
Ответ 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];
}
Очень грубый псевдокод, но, надеюсь, вы получите суть:)