2012-08-25 11 views
10

Rozważmy następujące oświadczenie:Objective-C Do-in Loop Uzyskaj Index

for (NSString *string in anArray) { 

    NSLog(@"%@", string); 
} 

Jak mogę uzyskać indeks string w anArray bez użycia tradycyjnego for pętlę i bez sprawdzania wartości string z każdego obiektu w anArray?

Odpowiedz

34

Macierze są gwarantowane do iteracji w porządku obiektowym. Więc:

NSUInteger index = 0; 
for(NSString *string in anArray) 
{ 
    NSLog(@"%@ is at index %d", string, index); 

    index++; 
} 

Alternatywnie, użyj wyliczający bloku:

[anArray 
    enumerateObjectsUsingBlock: 
     ^(NSString *string, NSUInteger index, BOOL *stop) 
     { 
      NSLog(@"%@ is at index %d", string, index); 
     }]; 
-1

Spróbuj tego.

for (NSString *string in anArray) 
{ 
    NSUInteger index = [anArray indexOfObject:string]; 
} 
+4

'- indexOfObject' jest operacją' O (n) ', więc ten algorytm to' O (n^2) '. Jest to znacznie gorsze niż inkrementowanie indeksu dla każdej iteracji lub użycie '- enumerateObjectsUsingBlock:', z których oba są nadal 'O (n)'. –

+4

Ta odpowiedź jest ** błędna **. Jeśli 'anArray' zawiera duplikaty,' index' dla powielonych elementów będzie niepoprawny. – Pang