2012-03-15 19 views
15

noobie pytanie .. Jaki jest najlepszy sposób, aby sprawdzić, czy istnieje indeks NSArray lub NSMutableArray. Wszędzie szukam, bez skutku !!NSArray poza granicami sprawdzić

To co próbowałem:

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

lub

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

ale zarówno zgłasza "poza zakresem" błąd nie pozwala mi kontynuować

(nie odpowie próbuję złapać, ponieważ to nie jest rozwiązanie dla mnie)

Z góry dzięki

Odpowiedz

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

Cholera .. im tak głupi .. oczywiście !! tablica jest wypełniana sekwencyjnie. Zrobiłem sobie bałagan w głowie. Dzięki kolego +1 – spacebiker

+3

Myślę, że język obcy jest tu trochę głupi. Byłoby mi wygodniej, gdyby '[tablica objectAtIndex: outOfBounds]' zwróciło 'nil' zamiast upaść. – turingtested

0

Pamiętaj NSArray jest w porządku sekwencyjnym z 0 do n-1 przedmioty

Twój próbują accessitem który przekroczył granicę a array jest nil następnie kompilator wyrzucić z bound error.

EDIT: odpowiedź @ SCH jest powyżej pokazuje w jaki sposób możemy sprawdzić, czy NSArray wymagało zamawiać element obecny w to lub nie.

+0

Tablica N pozycji jest w porządku sekwencyjnym od 0 do N-1 – tothemario

+0

@tothemario: cudowny połów. Dzięki –

2

Jeśli masz indeksu całkowitą (np i), można generalnie uniknąć tego błędu, sprawdzając tablice granic jak ten

int indexForObjectInArray = 4; 
NSArray yourArray = ... 

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

Można użyć operatora MIN niepowodzenie cicho jak to [array objectAtIndex:MIN(i, array.count-1)], albo uzyskać następny obiekt w tablicy lub ostatnio. Może być przydatne, gdy na przykład chcemy złączyć ciągi:

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); 

Wynik: „Niektóre losowy tablicy ciągów.....”

Powiązane problemy