NSSet не содержал объект, даже если они равны - PullRequest
0 голосов
/ 11 мая 2019

Класс Person:

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@end

Я переписываю это isEqual: метод:

- (BOOL)isEqual:(id)object {
    Person *person = (Person *)object;
    return [self.name isEqualToString:person.name];
}

Затем я сделал тест:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    Person *p1 = [[Person alloc] init];
    p1.name = @"Jack";

    Person *p2 = [[Person alloc] init];
    p2.name = @"Jack";

    if ([p1 isEqual:p2]) {
        NSLog(@"p1 isEqual p2");
    } else {
        NSLog(@"p1 not Equal p2");
    }

    NSMutableSet *set = [NSMutableSet set];
    [set addObject:p1];

    if ([set containsObject:p2]) {
        NSLog(@"contain p2");
    } else {
        NSLog(@"not contain p2");
    }
}

Печать консоли:

p1 isEqual p2
not contain p2

О методе containsObject::

Каждый элемент набора проверяется на равенство с anObject, пока не будет найдено совпадение или конец конца.набор достигнут.Объекты считаются равными, если isEqual: возвращает YES.

Так что я немного запутался:

Теперь, когда p1 равен p2, почемунабор не содержал p2

1 Ответ

2 голосов
/ 11 мая 2019

Из документации для протокола NSObject :

Если два объекта равны, они должны иметь одинаковое хеш-значение. это Последний пункт особенно важен, если вы определяете isEqual: в подкласс и намерены поместить экземпляры этого подкласса в коллекция. Убедитесь, что вы также определили хеш в своем подклассе.

...