NSMutableSet позволяет добавлять несколько объектов с одинаковым хешем - PullRequest
1 голос
/ 24 декабря 2011

У меня есть подкласс NSObject, в котором я реализовал следующие методы isEqual: и hash для тестирования:

- (BOOL)isEqual:(id)anObject {
    return YES;
}

- (NSUInteger)hash {
    return 1;
}

По какой-то причине я могу добавить несколько объектов этого класса в NSMutableSet, даже если они "одинаковые". Есть ли причина, по которой это не будет работать?

<ч />

Обновление: Оказывается, я назначал экземпляр NSMutableArray для ивара типа NSMutableSet. D'ой!

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

В вашем коде должно быть что-то еще, что вы не делаете правильно, потому что переопределение методов, как вы показываете в OP, заставляет NSMutableSet распознавать мои объекты как идентичные:

test.h:

#import "Foundation/Foundation.h"
@interface Test : NSObject
@end

Test.m:

#import "Test.h"
@implementation Test
- (BOOL)isEqual:(id)anObject {
    return YES;
}
- (NSUInteger)hash {
    return 1;
}
@end

main.c:

#include <CoreFoundation/CoreFoundation.h>
#import "Test.h"
int main (int argc, const char * argv[]) {
    Test *t1 = [[Test alloc] init];
    Test *t2 = [[Test alloc] init];
    Test *t3 = [[Test alloc] init];
    Test *t4 = [[Test alloc] init];
    NSSet *s = [NSMutableSet setWithObjects:t1, t2, t3, t4, nil];
    NSLog(@"%lu", s.count);
    return 0;
}

Этот фрагмент выдает 1, как и ожидалось.

1 голос
/ 24 декабря 2011

Метод addObject возвращает void и не предоставляет никакой обратной связи относительно того, действительно ли элемент был "добавлен".

- (void)addObject:(id)object

Перечисляете ли вы набор, чтобы определить, что объект (ы) был "добавлен дважды"?Иначе, что заставляет вас верить в это?

Если два набора были объединены вместе с unionSet, должна ли произойти ошибка, если оба набора содержат один и тот же объект?Или результат должен включать в себя один и тот же объект и оба исходных набора?

Что если вы объедините набор из одного предмета?Потому что, если вы согласны с вышеизложенным, вы поймете, почему я говорю следующее ...

Я думаю, что это просто молча проглотить вторую попытку addObject (так, как это должно быть) и продолжитьжизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...