Сравнение объектов в Obj-C - PullRequest
       2

Сравнение объектов в Obj-C

10 голосов
/ 20 февраля 2011

Как можно сравнивать объекты в Objective-C?

Это так же просто, как ==?

Я хочу проверить массив на предмет объекта и, если он не существует, добавить его в массив в противном случае, удалить его из массива.

Ответы [ 4 ]

18 голосов
/ 20 февраля 2011

Сравнение объектов в Objective-C работает почти так же, как в Java или других объектно-ориентированных языках:

  • == сравнивает ссылку на объект; в Objective-C, занимают ли они один и тот же адрес памяти.
  • isEqual:, метод, определенный в NSObject , проверяет, являются ли два объекта «одинаковыми». Вы можете переопределить этот метод, чтобы обеспечить собственную проверку равенства для ваших объектов.

Так что обычно, чтобы делать то, что вы хотите, вы должны делать:

if(![myArray containsObject:anObject]) {
    [myArray addObject:anObject];
}

Это работает, потому что тип массива Objective-C, NSArray , имеет метод с именем containsObject:, который отправляет сообщение isEqual: каждому объекту, который он содержит с вашим объектом в качестве аргумента. Он не использует ==, если реализация isEqual: не основана на ==.

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

11 голосов
/ 20 февраля 2011

Каждый объект Objective-C имеет метод с именем isEqual:.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/isEqual:

Таким образом, вы хотели бы переопределить это для ваших пользовательских типов объектов.

Одно важное примечание в документации:

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

4 голосов
/ 20 февраля 2011

== будет сравнивать указатель, вам нужно переопределить

- (BOOL)isEqual:(id)anObject
2 голосов
/ 23 мая 2015

Реализация isEqual: и хэш

Согласно документации Apple по NSObject вам необходимо реализовать isEqual: и hash как минимум. Ниже вы найдете один способ реализации равенства объектов, конечно, как реализация hash вступает в страну серьезных дебатов здесь, о StackOverflow, но это будет работать. Общее правило - вам нужно определить, из чего состоит равенство объектов, и для каждого уникального объекта они должны иметь уникальный хеш. Рекомендуется также добавить метод равенства для конкретного объекта, например, NSString имеет isEqualToString:.

- (BOOL)isEqual:(id)object
{
    BOOL result = NO;

    if ([object isKindOfClass:[self class]]) {
        CLPObject *otherObject = object;
        result = [self.name isEqualToString:[otherObject name]] &&
        [self.shortName isEqualToString:[otherObject shortName]] &&
        [self.identifier isEqualToString:[otherObject identifier]] &&
        self.boardingAllowed == [otherObject isBoardingAllowed];
    }

    return result;
}

- (NSUInteger)hash
{
    NSUInteger result = 1;
    NSUInteger prime = 31;

    result = prime * result + [_name hash];
    result = prime * result + [_shortName hash];
    result = prime * result + [_identifier hash];
    result = prime * result + _boardingAllowed;

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