1、遍歷數(shù)組
NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
[iosArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"E"]) {
*stop = YES;
}
}];
參數(shù)說明:obj表示數(shù)組中的元素,idx表示元素的下標,stop可以控制遍歷何時停止,在需要停止時令stop = YES即可(不要忘記前面的*)。
這種方法清晰明了,數(shù)組元素,下標都可直接獲取,就連何時停止都很容易實現(xiàn),break都可以退休了,遍歷字典也同樣簡單。
2、遍歷字典
NSDictionary *dict = @{@"1":@"11", @"2":@"22", @"3":@"33"};
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"22"]) {
*stop = YES;
}
}];
你沒有看錯,就是這么簡單,block直接把字典的key和value都給我們了,再也不用書寫直白而繁瑣的代碼了。
注意:
若已知collection里對象的數(shù)據(jù)類型,可以修改塊簽名,知道對象的精確類型后,編譯器就可以檢測開發(fā)者是否調(diào)用了該對象所不具有的方法,并在發(fā)現(xiàn)問題時報錯。
NSDictionary *dict = @{@"1":@"11", @"2":@"22", @"3":@"33"};
[dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"22"]) {
*stop = YES;
}
}];
如代碼,直接把key和value的類型修改成NSString類型。
3、反向遍歷:
反向遍歷也同樣方便,調(diào)用另外一個方法即可:
NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
[iosArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([obj isEqualToString:@"E"]) {
*stop = YES;
}
}];
這個方法相對于正向遍歷多了一個枚舉類型的參數(shù)NSEnumerationReverse,打開這個選項就可以反向遍歷了。
4、并發(fā)遍歷:
順著這個枚舉類型的參數(shù),就會引出塊枚舉的另一大優(yōu)勢:并發(fā)遍歷,參數(shù)是:NSEnumerationConcurrent,也就是可以同時遍歷collection中的幾個元素,具體數(shù)量根據(jù)系統(tǒng)資源而定。這樣會充分利用系統(tǒng)資源,高效快捷的完成collection的遍歷,系統(tǒng)底層會通過GCD來處理并發(fā)事宜,開發(fā)者不需要擔心內(nèi)存和線程,其他方式若要實現(xiàn)高效的并發(fā)遍歷十分有難度。通過塊枚舉遍歷,改變collection并不會引起崩潰,代碼如下:
NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
NSMutableArray *iosMutableArray = [NSMutableArray arrayWithArray:iosArray];
[iosMutableArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj = [NSString stringWithFormat:@"_%@", obj];
[iosMutableArray replaceObjectAtIndex:idx withObject:obj];
NSLog(@"%@", obj);
if ([obj isEqualToString:@"_I"]) {
*stop = YES;
}
}];