Почему NSOrderedMutableSet добавляет объекты, данные которых совпадают?
Я создаю объекты и добавляю их в набор, используя -[NSOrderedMutableSet addObject:]
, но я обнаружил, что проверяются только дубликаты самих объектов - предположительно, адрес указателя объекта, и что возможно добавить несколько объектов с одинаковым содержимым.
Например:
SomeObject* object = [SomeObject alloc] initWithStuff:stuff];
SomeObject* object2 = [SomeObject alloc] initWithStuff:stuff];
[set addObject:object];
[set addObject:object];
[set addObject:object1];
[set addObject:object2];
Количество будет 2.
Это заставляет меня задуматься, в чем смысл этих занятий? При каких обстоятельствах можно иметь объект и не знать, был ли сам объект уже добавлен в коллекцию, а не данные, содержащиеся в объекте?
Какой самый простой способ (или какой класс я должен использовать) использовать, чтобы убедиться, что набор содержит только один из каждого объекта на основе содержимого?
2 ответа
То, как вы смотрите, это правильный путь, вы забыли небольшую деталь: как мог NSMutableOrderedSet
класс знает о каких случаях SomeObject
содержат одинаковые значения?
Ответ прост: вы должны предоставить свои собственные реализации
- (BOOL)isEqual:(id)anObject
- (NSUInteger)hash
Так что ваши экземпляры будут возвращать true при сравнении с одинаковыми внутренними значениями, и два экземпляра с одинаковыми данными будут иметь одинаковый хэш-код.
Кроме того, эти наборы довольно полезны, поскольку они упрощают проверку того, содержится ли экземпляр в наборе или нет, и вы можете быстро выполнять над ними множество логических операций, таких как пересечение, объединение, различие и все, что угодно.
Если у вас есть пользовательский объект, вам нужно будет реализовать свой собственный метод isEqual: и хеш, чтобы проверить на равенство и предотвратить дублирование в наборе.