Подтвердить что ты не робот

Объект c - уникальное свойство объекта NSMutableSet

В моем приложении у меня есть класс Person с свойством personId.
Теперь мне нужна некоторая структура данных, чтобы содержать кучу уникальных объектов Person (unique = different personId)

Итак, я предполагаю, что я должен использовать NSMutableSet в качестве моей структуры данных, но как заставить NSMutableSet сравнить свойство personId при добавлении человека (поэтому я не буду добавлять того же человека больше, чем те)?

Моя цель состоит в том, чтобы постоянно иметь коллекцию уникальных людей (даже если я добавляю двух человек с одинаковым идентификатором), я хочу, чтобы NSMutableSet выполнял всю тяжелую работу для меня, и если я добавляю человека который уже существует, он не будет добавлять его дважды.

4b9b3361

Ответ 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];
}

Очень грубый псевдокод, но, надеюсь, вы получите суть:)