NSArray*iosArray =@[@"L",@"O",@"V",@"E",@"I",@"O",@"S"];
```
```
[iosArrayenumerateObjectsUsingBlock:^(id_Nonnullobj,NSUIntegeridx,BOOL*_Nonnullstop) {
NSLog(@"%@", obj);
if([objisEqualToString:@"E"]) {
*stop =YES;
}
}];
```
參數說明:obj表示數組中的元素,idx表示元素的下標,*stop可以控制遍歷何時停止,在需要停止時令*stop = YES即可(不要忘記前面的*)。
這種方法清晰明了,數組元素,下標都可直接獲取,就連何時停止都很容易實現,break都可以退休了,遍歷字典也同樣簡單。
NSDictionary*dict =@{@"ios":@"11",@"jave":@"22",@"oc":@"33"};
[dictenumerateKeysAndObjectsUsingBlock:^(id_Nonnullkey,id_Nonnullobj,BOOL*_Nonnullstop) {
NSLog(@"key = %@", key);
NSLog(@"obj = %@", obj);
if([objisEqualToString:@"22"]) {
*stop =YES;
}
}];
若已知collection里對象的數據類型,可以修改塊簽名,知道對象的精確類型后,編譯器就可以檢測開發者是否調用了該對象所不具有的方法,并在發現問題時報錯。
NSDictionary*dict =@{@"ios":@"11",@"jave":@"22",@"oc":@"33"};
[dictenumerateKeysAndObjectsUsingBlock:^(NSString*key,NSString*obj,BOOL*_Nonnullstop) {
NSLog(@"key = %@", key);
NSLog(@"%@", obj);
if([objisEqualToString:@"22"]) {
*stop =YES;
}
}];
如代碼,直接把key和value的類型修改成NSString類型。
反向遍歷:
反向遍歷也同樣方便,調用另外一個方法即可:
NSArray*iosArray =@[@"L",@"O",@"V",@"E",@"I",@"O",@"S"];
[iosArrayenumerateObjectsWithOptions:NSEnumerationReverseusingBlock:^(NSString*obj,NSUIntegeridx,BOOL*_Nonnullstop) {
NSLog(@"%@", obj);
if([objisEqualToString:@"E"]) {
*stop =YES;
}
}];
這個方法相對于正向遍歷多了一個枚舉類型的參數NSEnumerationReverse,打開這個選項就可以反向遍歷了。
并發遍歷:
順著這個枚舉類型的參數,就會引出塊枚舉的另一大優勢:并發遍歷,參數是:NSEnumerationConcurrent,也就是可以同時遍歷collection中的幾個元素,具體數量根據系統資源而定。這樣會充分利用系統資源,高效快捷的完成collection的遍歷,系統底層會通過GCD來處理并發事宜,開發者不需要擔心內存和線程,其他方式若要實現高效的并發遍歷十分有難度。通過塊枚舉遍歷,改變collection并不會引起崩潰,代碼如下:
NSArray*iosArray =@[@"L",@"O",@"V",@"E",@"I",@"O",@"S"];
NSMutableArray*iosMutableArray = [NSMutableArrayarrayWithArray:iosArray];
[iosMutableArrayenumerateObjectsWithOptions:NSEnumerationConcurrentusingBlock:^(NSString*obj,NSUIntegeridx,BOOL*_Nonnullstop) {
obj = [NSStringstringWithFormat:@"_%@", obj];
[iosMutableArrayreplaceObjectAtIndex:idxwithObject:obj];
NSLog(@"%@", obj);
if([objisEqualToString:@"_I"]) {
*stop =YES;
}
}];