Проверка того, содержит ли массив определенный объект (iOS)
Мне нужно проверить, содержит ли определенный массив определенный объект, и если он это делает, удалите этот объект. Если у него нет этого объекта, функция добавляется в массив. Проблема в том, что объект всегда добавляется, потому что проверяющий оператор всегда возвращает false.
Здесь моя текущая функция:
- (void) myFunction:(NSString *)parameter {
if (![myMutableArray containsObject:parameter]) {
[myMutableArray addObject:parameter];
NSLog(@"%@ added", parameter);
} else {
[myMutableArray removeObject:parameter];
NSLog(@"%@ deleted", parameter);
}
}
Ответы
Ответ 1
containsObject вызывает isEqual для каждого объекта в массивах. Какой тип объекта вы проверяете? Если это настраиваемый объект, переопределить и реализовать метод isEqual.
Я предполагаю, что вы пытаетесь проверить значение объекта, но containsObject на самом деле вызывает isEqual, который сравнивает ссылку на объект, а не его фактическое значение.
Ответ 2
if (![arrList containsObject:arrObj]) {
// do something
}
containsObject:
Ответ 3
Сначала вам нужно проверить, какие данные типа или объект вы добавляете в этом myMutableArray
. Согласно вашему методу вы проверяете измененный массив для типа строки, который передал аргумент parameter
. Возможно, вы используете массив int или float.
В вашем массиве может быть проблема с типом. Если вы являетесь типом данных типа STRING, вы можете использовать другой метод, подобный этому.
- (void) myFunction:(NSString *)parameter {
for (int i = 0 ; i < [myMutableArray count ] ; i++) {
if (![[myMutableArray objectAtIndex:i] isEqualToString:parameter]) {
[myMutableArray addObject:parameter];
NSLog(@"%@ added", parameter);
}
else{
[myMutableArray removeObject:parameter];
NSLog(@"%@ deleted", parameter);
}
}
}
Надеюсь, это поможет вам. Если ваш объект не является типом NSString, тогда вам нужно преобразовать.
Ответ 4
Вы должны реализовать isEqual:
в своем пользовательском классе. По умолчанию два объекта идентичны, если они имеют одну и ту же ссылку.
Также убедитесь, что вы инициализировали свой изменяемый массив перед его использованием.
ИЗМЕНИТЬ
Похоже, что ваше имя переменной массива, скорее всего, ошибочно.
-
myMutableArray
-
myMutbaleArray
Ответ 5
Вероятно, вы забыли инициализировать свой NSMutableArray
. Если не инициализировано, вы отправляете addObject
сообщения объекту nil
, который не имеет эффекта, и массив никогда не содержит того, что вы ранее добавили...
Конечно, если массив nil
, то проверка contains
всегда будет возвращать значение false. Согласно документам Objective-C:
Если метод возвращает объект, любой тип указателя, любой целочисленный скаляр размером меньше или равным sizeof (void *), поплавок, двойной, длинный double или long long, тогда сообщение, отправленное в nil, возвращает 0.
И 0 ложно