Проверьте, существует ли что-то в NSMutableArray

У меня есть NSMutableArray, который может содержать несколько объектов. Я хотел бы проверить, существует ли объект, и если да, измените его. Мне было интересно проверить его. Я думал, что это сработает:

if ([[[self.myLibrary objectAtIndex:1] subObject] objectAtIndex:1]) // do something

Однако это приведет к сбою, если в индексе 1 нет каких-либо субъектов. Поэтому я думаю, проблема заключается в том, что вышеупомянутое не возвращает ниль, если в этом Индексе нет ничего.

Есть ли еще один простой способ проверить или мне придется подсчитывать массив и т.д.? Я знаю, что есть другие сообщения в stackoverflow, но я еще не нашел простой ответ.

Любые объяснения/предложения приветствуются. Спасибо!

Ответ 1

Без проверки просто:

[myArray indexOfObject:myObject];

или

[myArray containsObject:myObject];

Эти методы проверяют каждый объект с помощью isEqual.


Например:

NSUInteger objIdx = [myArray indexOfObject: myObject];
if(objIdx != NSNotFound) {
    id myObj = [myArray objectAtIndex: objIdx];
    // Do some alter stuff here
}

Ответ 2

Если это шаблон, который вы используете много, вы можете добавить категорию в NSArray, называемую чем-то вроде safeObjectAtIndex:, который принимает индекс, проверяет границы внутри:

-(id)safeObjectAtIndex:(NSUInteger)index {
  if (index >= [self count])
    return nil;
  return [self objectAtIndex:index];
}

Ответ 3

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

if ([array containsObject:objectToSearchFor]) {
    // modify objectToSearchFor
}

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

NSUInteger index = [array indexOfObject:objectToSearchFor];
if (index != NSNotFound) {
    id objectInArray = [array objectAtIndex:index];
    // modify objectInArray
}

Ответ 4

NSArray (это суперкласс класса NSMUtableArray) имеет множество методов для поиска объектов. Посмотрите documentation.

Вы можете либо положиться на метод equals (например, indexOfObject:), либо предоставить блок (например, indexOfObjectPassingTest:), который довольно напуган.

В Objective C довольно часто используется версия Mutable класса, но полагаются на методы в непеременном суперклассе, поэтому всегда полезно при проверке онлайн-документации смотреть на суперкласс.