Проверьте, существует ли что-то в NSMutableArray - PullRequest
11 голосов
/ 22 июля 2011

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

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

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

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

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

Ответы [ 4 ]

46 голосов
/ 22 июля 2011

Нет проверки, просто используя:

[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
}
13 голосов
/ 22 июля 2011

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

-(id)safeObjectAtIndex:(NSUInteger)index {
  if (index >= [self count])
    return nil;
  return [self objectAtIndex:index];
}
3 голосов
/ 22 июля 2011

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

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

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

NSUInteger index = [array indexOfObject:objectToSearchFor];
if (index != NSNotFound) {
    id objectInArray = [array objectAtIndex:index];
    // modify objectInArray
}
2 голосов
/ 22 июля 2011

NSArray (который является суперклассом NSMUtableArray) имеет множество методов для поиска объектов.Взгляните на документацию .

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

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

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