NSArray содержит метод Object
У меня есть простой вопрос относительно кодирования 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
Документация для [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;
}
Для лучшей реализации вы можете посмотреть на question.