Проверка NSArray вне границ

noobie question. Каков наилучший способ проверить, существует ли индекс NSArray или NSMutableArray. Я ищу везде безрезультатно!!

Вот что я пробовал:

if (sections = [arr objectAtIndex:4])
{
    /*.....*/
}

или

sections = [arr objectAtIndex:4]
if (sections == nil)
{
    /*.....*/
}

но оба вызывают ошибку "за пределами границ", не позволяя мне продолжить

(не отвечайте с помощью try catch, потому что это не решение для меня)

Заранее спасибо

Ответы

Ответ 1

if (array.count > 4) {
    sections = [array objectAtIndex:4];
}

Ответ 2

Если у вас есть индекс целых чисел (например, i), вы можете вообще предотвратить эту ошибку, проверив границы массивов, подобные этой

int indexForObjectInArray = 4;
NSArray yourArray = ...

if (indexForObjectInArray < [yourArray count])
{
    id objectOfArray = [yourArray objectAtIndex:indexForObjectInArray];
}

Ответ 3

Помните, что NSArray находится в последовательном порядке от от 0 до N-1.

Вы пытаетесь access item, у которого превышен лимит, а array - nil, тогда компилятор выкинет из bound error.

EDIT: ответ на @sch выше показывает, как мы можем проверить, есть ли у NSArray требуемый упорядоченный элемент, присутствующий в нем или нет.

Ответ 4

Вы можете использовать оператор MIN, чтобы терпеть неудачу, как этот [array objectAtIndex:MIN(i, array.count-1)], чтобы либо получить следующий объект в массиве, либо последним. Может быть полезно, когда вы, например, хотите объединить строки:

NSArray *array = @[@"Some", @"random", @"array", @"of", @"strings", @"."];
NSString *concatenatedString = @"";
for (NSUInteger i=0; i<10; i++) {  //this would normally lead to crash
    NSString *nextString = [[array objectAtIndex:MIN(i, array.count-1)]stringByAppendingString:@" "];
    concatenatedString = [concatenatedString stringByAppendingString:nextString];
    }
NSLog(@"%@", concatenatedString);

Результат: "Некоторые случайные массивы строк..."