2013-03-23 52 views
3

在給定索引之前迭代通過NSArray索引的最簡潔方法是什麼?例如:在給定索引之前使用enumerateObjectsAtIndexes或for循環遍歷NSArray的所有索引

NSArray *myArray = @[ @"animal" , @"vegetable" , @"mineral" , @"piano" ]; 

[myArray enumerateObjectsAtIndexes:@"all before index 2" options:nil 
    usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      // this block will be peformed on @"animal" and @"vegetable" 
    }]; 

而且,這不應該循環可言如果給定的指標是0

什麼是最簡潔,優雅的方式來做到這一點?到目前爲止,我只拼湊了笨拙的多行答案,這些答案使用惱人的NSRanges和索引集。有沒有更好的方式可以忽略?

+0

任意數量的方式來實現。簡明並不意味着明確。使用什麼做實際的工作。不要打架。迭代NSArray不需要使用該方法。該方法給出了塊的使用情況,這對塊的好處非常大。 – uchuugaka 2013-03-23 12:21:30

回答

1

什麼:

index = 2; 
for (int i = 0; i < [myArray count] && i < index; ++i) { 
    id currObj = [myArray objectAtIndex:i]; 
    // Do your stuff on currObj; 
} 
+0

爲什麼需要「我 zakdances 2013-03-25 09:33:16

+0

if index> = [myArray count]你有麻煩:) – giorashc 2013-03-25 14:57:33

3
NSArray *myArray = @[ @"animal" , @"vegetable" , @"mineral" , @"piano" ]; 
NSUInteger stopIndex = 2; 

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if (idx == stopIndex) { 
     *stop = YES; // stop enumeration 
    } else { 
     // Do something ... 
     NSLog(@"%@", obj); 
    } 
}]; 
+0

這是一個不錯的選擇。有沒有辦法做到這一點沒有if/else?像* stop =(idx == stopIndex)? (return;):NO; – zakdances 2013-03-23 12:38:49

+0

@yourfriendzak:不是。根據文件,你應該只給''stop'分配YES。從三元運算符中調用'return'就是我所說的「混淆編程」:-) – 2013-03-23 12:43:30

+0

這個要求是由枚舉方法的另一個變體提供的併發枚舉引起的。 – bbum 2013-03-23 13:36:31

3
[myArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, idx)]  
          options:0 
         usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

}]; 
+1

爲什麼在'NSMakeRange(-1,idx)'中有'-1'?該不該是'0'? – 2013-03-23 12:32:33

+0

@MartinR固定,謝謝 – zakdances 2013-03-23 12:34:19

+1

@yourfriendzak。還提供nil作爲(NSEnumerationOption)選項的參數:會給你一個類型轉換警告。所以寧可在這裏給零,如果你想忽略這個警告,你最好提供0。 – Arslan 2013-04-29 09:45:14

1

個人而言,我會去與如圖Martin Ryourfriendzak基於塊的枚舉,通過giorashc接受的答案是可能是最糟糕的,因爲它不提供突變警衛。

我想添加一個(正確的)快速列舉例如

NSUInteger stopIndex = 2; 
NSUInteger currentIndex = 0; 
for (MyClass *obj in objArray) { 
    if (currentIndex < stopIndex) { 
     // do sth... 
    } else { 
     break; 
    } 
    ++currentIndex;  
}