Проверка того, содержит ли массив определенный объект (iOS) - программирование
Подтвердить что ты не робот

Проверка того, содержит ли массив определенный объект (iOS)

Мне нужно проверить, содержит ли определенный массив определенный объект, и если он это делает, удалите этот объект. Если у него нет этого объекта, функция добавляется в массив. Проблема в том, что объект всегда добавляется, потому что проверяющий оператор всегда возвращает false.

Здесь моя текущая функция:

- (void) myFunction:(NSString *)parameter {

    if (![myMutableArray containsObject:parameter]) {

        [myMutableArray addObject:parameter];
        NSLog(@"%@ added", parameter);

    } else {

        [myMutableArray removeObject:parameter];
        NSLog(@"%@ deleted", parameter);

    }
}
4b9b3361

Ответ 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 ложно