基于塊的遍歷方式

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;

  }

}];

摘自iOS開發(fā)遍歷集合方法總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容