Ответ 1
if (array.count > 4) {
sections = [array objectAtIndex:4];
}
noobie question. Каков наилучший способ проверить, существует ли индекс NSArray или NSMutableArray. Я ищу везде безрезультатно!!
Вот что я пробовал:
if (sections = [arr objectAtIndex:4])
{
/*.....*/
}
или
sections = [arr objectAtIndex:4]
if (sections == nil)
{
/*.....*/
}
но оба вызывают ошибку "за пределами границ", не позволяя мне продолжить
(не отвечайте с помощью try catch, потому что это не решение для меня)
Заранее спасибо
if (array.count > 4) {
sections = [array objectAtIndex:4];
}
Если у вас есть индекс целых чисел (например, i
), вы можете вообще предотвратить эту ошибку, проверив границы массивов, подобные этой
int indexForObjectInArray = 4;
NSArray yourArray = ...
if (indexForObjectInArray < [yourArray count])
{
id objectOfArray = [yourArray objectAtIndex:indexForObjectInArray];
}
Помните, что NSArray находится в последовательном порядке от от 0 до N-1.
Вы пытаетесь access
item
, у которого превышен лимит, а array
- nil
, тогда компилятор выкинет из bound error
.
EDIT: ответ на @sch выше показывает, как мы можем проверить, есть ли у NSArray требуемый упорядоченный элемент, присутствующий в нем или нет.
Вы можете использовать оператор 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);
Результат: "Некоторые случайные массивы строк..."