NSArray содержит методObject - PullRequest
17 голосов
/ 31 мая 2010

У меня простой вопрос, касающийся кодирования xcode, но я не знаю, почему все работает не так, как я думаю.У меня есть массив объектов (пользовательских объектов).Я просто хочу проверить, находится ли этот в массиве.Я использовал следующий код:

NSArray *collection = [[NSArray alloc] initWithObjects:A, B, C, nil]; //A, B, C are custom "Item" objects
Item *tempItem = [[Item alloc] initWithLength:1 width:2 height:3];  //3 instance variables in "Item" objects
if([collection containsObject:tempItem]) {
    NSLog(@"collection contains this item");
}

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

NSLog(@"L:%i W:%i H:%i", itemToCheck.length, itemToCheck.width, itemToCheck.height);
for (int i = 0, i < [collection count], i++) {
    Item *itemInArray = [collection objectAtIndex:i];
    NSLog(@"collection contains L:%i W:%i H:%i", itemInArray.length, itemInArray.width, itemInArrayheight);
}

В консоли вот что я получил:

L:1 W:2 H:3
collection contains L:0 W:0 H:0
collection contains L:1 W:2 H:3
collection contains L:6 W:8 H:2

Очевидно, что tempItem находится внутри collection массив, но ничего не появляется, когда я использую containsObject:, чтобы проверить это.Может ли кто-нибудь дать мне какое-то указание, в какой части я ошибаюсь?Большое спасибо!

1 Ответ

40 голосов
/ 31 мая 2010

Документация для [NSArray containsObject:] гласит:

Этот метод определяет, является ли anObject присутствует в приемнике отправка isEqual: сообщение каждому из объекты получателя (и передача anObject как параметр для каждого isEqual: сообщение).

Проблема в том, что вы сравниваете ссылки на объекты, а не значения объектов. Чтобы этот конкретный пример работал, вам необходимо либо отправить [collection containsObject:] экземпляр переменной, которую он содержит (например, A, B или C), либо вам придется переопределить [NSObject isEqual:] метод в вашем Item классе.

Вот как может выглядеть ваш isEqual метод:

- (BOOL)isEqual:(id)other {
    if (other == self)
      return YES;
    if (!other || ![other isKindOfClass:[self class]])
      return NO;
    if (self.length != other.length || self.width != other.width || self.height != other.height)
      return NO;
    return YES;
}

Для лучшей реализации вы можете посмотреть на этот вопрос .

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