国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS中遍歷的方法總結

2019-10-21 18:46:47
字體:
來源:轉載
供稿:網友

在iOS開發中,可以使用多種方法進行元素遍歷,具體有一下幾種:

經典for循環

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];for (int i = 0; i < iosArray.count; i++) {  //處理數組中數據  NSLog(@"%@", iosArray[i]);}

NSEnumerator遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];NSEnumerator *enumerator = [iosArray objectEnumerator];//正向遍歷// NSEnumerator *enumerator = [iosArray reverseObjectEnumerator];//反向遍歷id object;while ((object = [enumerator nextObject]) != nil) {  //處理枚舉器中的數據  NSLog(@"%@", object);}

for-in快速遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];for (NSString *obj in iosArray) {  //處理數組中的數據  NSLog(@"%@", obj);}

EnumeratorBlock遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];[iosArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {  NSLog(@"%@", obj);  if ([obj isEqualToString:@"e"]) {    *stop = YES;  // 跳出遍歷  }}];

另外,EnumeratorBlock還支持反向遍歷,并發遍歷,并發遍歷可以使用多核的優化,充分利用系統的資源。

反向遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];[iosArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {  NSLog(@"%@", obj);  if ([obj isEqualToString:@"e"]) {    *stop = YES;  }}];

并發遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];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;  }}];

dispatch_apply遍歷

dispatch_apply類似于for循環,這里需要注意的是,dispatch_apple是同步調用,調用完畢返回結果,并且由于是GCD實現,所以可以使用并發隊列或者是串行隊列。代碼如下:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);//  dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL); // 串行隊列dispatch_apply(array.count, queue, ^(size_t i) {  Enumerate *enumerate = [array objectAtIndex:i];  NSLog(@"number: %ld", enumerate.number);});

遍歷的注意事項

for循環中不要修改數組

遍歷過程中是不能隨便刪除遍歷的元素的,如果需要刪除元素,可以先復制一份出來,比如如下的代碼會有問題:

NSMutableArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];for (NSString *obj in iosArray) {  //處理數組中的數據  if([@"e" isEqualTo:obj]) {    [iosArray removeObject:obj];  }}

但是使用enumerateBlock可以在block內部做removeObject操作,原因應該是和Block的特性有關, 在Block中會保存變量的值,而不會隨變量的值的改變而改變 。

遍歷的速率

當數組容量很大的時候,如果只是進行數組遍歷的話,使用for-in是最快速的,其次是并發遍歷,這個很多人都以為enumerateBlock是最快的。

遍歷實踐tips

數組分組

在開發中,有時需要對數組進行某種情況的分組,比如,一個擁有很多消息模型的數組,我們需要根據消息的創建月份進行分組,那么可以使用下面的方法實現:

NSMutableSet *set=[NSMutableSet set];NSArray *array = @[message1, message2, message3, message4, message5, message6, message7];__block NSArray *tempDataArray = [NSArray arrayWithArray:array];[tempDataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {  [set addObject:obj.month];//利用set不重復的特性,得到有多少組,根據數組中消息的月份屬性}];[set enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {//遍歷set數組  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.month = %@", obj];//創建謂詞篩選器  NSArray *group = [tempDataArray filteredArrayUsingPredicate:predicate];//用數組的過濾方法得到新的數組,在添加的最終的數組}

倒序遍歷

倒序遍歷也很常見,可以使用上面的反向遍歷來實現。

set排序

這個和Emunerate其實沒有關系,但是也很實用,我們知道set是無序的,但是有時需要實現有順序的set,可以使用下面來實現:

//由于set無序,現將set轉換成nsarrayNSArray *sortDescriptor = @[[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO]];NSArray *sortSetArray = [set sortedArrayUsingDescriptors:sortDescriptor];

其實原理是將set轉化成array來實現的。

總結

遍歷在我們日常開發中十分常見,根據應用場景,選擇合適的遍歷方法才是我們需要關系的。這篇文章總結了下遍歷的種類和注意事項,希望能幫助到有需要的同學。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 信宜市| 岑巩县| 剑川县| 延安市| 平山县| 宜川县| 沿河| 斗六市| 汾西县| 长治市| 屏南县| 松潘县| 通城县| 通许县| 康保县| 同仁县| 年辖:市辖区| 咸丰县| 英超| 自贡市| 天台县| 荔波县| 江川县| 平凉市| 交口县| 南安市| 仪陇县| 巴楚县| 泸州市| 内乡县| 卢氏县| 新龙县| 周宁县| 信宜市| 沙坪坝区| 衢州市| 日土县| 永年县| 南川市| 金堂县| 南召县|