本文轉自文頂頂,稍加修改 1.for迴圈 要遍歷字典、數組或者是集合,for迴圈是最簡單也用的比較多的方法 優點:簡單 缺點:由於字典和集合內部是無序的,導致我們在遍歷字典和集合的時候需要藉助一個新的『數組』作為中介來處理,多出了一部分開銷。 2.for....in....遍歷 在Objective ...
本文轉自文頂頂,稍加修改
1.for迴圈
要遍歷字典、數組或者是集合,for迴圈是最簡單也用的比較多的方法
//1).數組 NSArray *arr1 = @[@"a1",@"a2",@"a3",@"a4"]; for (int i = 0; i<arr1.count; i++) { NSLog(@"%@",arr1[i]); } /* 2).字典 由於字典是無序的,遍歷前要排序 1.按NSDictionary的key來對其進行排序: 2.將字典的Value再放到一個字典裡面,key分別使用有序的字元串 3.先將字典轉模型,再放到數組裡面 4.先將dict的allkeys賦給一個數組,然後通過sortedArrayUsingComparator:方法對數組排序,然後遍曆數組取字典對應key的值就ok */ NSDictionary *dic = @{@"1":@"a",@"2":@"b",@"3":@"c",@"4":@"d"}; NSArray *arr2 = [dic allKeys]; NSArray *sortA = [arr2 sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; for (int i = 0; i<sortA.count; i++) { NSString *key = sortA[i]; NSString *str = [dic objectForKey:key]; NSLog(@"%@",str); } // 3).反向遍歷----降序遍歷----以數組為例 NSArray *arr3 = @[@"12",@"13",@"14",@"15"]; NSInteger arr3Count = [arr3 count]-1; for (NSInteger i = arr3Count; i>=0; i--) { NSString *obj = arr3[i]; NSLog(@"%@",obj); }
優點:簡單
缺點:由於字典和集合內部是無序的,導致我們在遍歷字典和集合的時候需要藉助一個新的『數組』作為中介來處理,多出了一部分開銷。
2.for....in....遍歷
在Objective-C 2.0 中增加了for ...In 形式的快速遍歷。此種遍歷方式語法簡潔,速度飛快。示例如下:
// 1).數組 NSArray *arr1 = @[@"1",@"2",@"3",@"4"]; for(id obj in arr1){ NSLog(@"%@",obj); } // 2.)字典 NSDictionary *dic2 = @{@"1":@"one",@"2":@"two",@"3":@"three"}; for(NSString *str in dic2){ NSLog(@"%@",dic2[str]); } // 3).處理集合 NSSet *set = [[NSSet alloc]initWithObjects:@"王尼瑪",@"鐵柱",@"趙無能", nil]; for (id obj in set) { NSLog(@"%@",obj); } // 4).反向遍歷,降序遍歷--以數組為例 NSArray *arr4 = @[@"我",@"的",@"世",@"界"]; for (id obj in [arr4 reverseObjectEnumerator]) { NSLog(@"%@",obj); }
優點:1)語法簡潔;2)效率最高;
缺點:無法獲得當前遍歷操作所針對的下標。
3.基於Block的遍歷方式
基於Block的方式來進行遍歷是最新引入的方法。它提供了遍曆數組|字典等類型數據的最佳實踐。示例如下:
-(void)step3{ // 1).數組 NSArray *arr1 = @[@"王",@"二",@"麻",@"子"]; [arr1 enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSLog(@"%zd--%@",idx,obj); }]; // 2).字典 NSDictionary *dii = @{@"1":@"生",@"2":@"活",@"3":@"不"}; [dii enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { NSLog(@"%@:%@",key,obj); }]; // 3).集合 NSSet *set = [[NSSet alloc]initWithObjects:@"止",@"眼",@"前",@"的",nil]; [set enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) { NSLog(@"%@",obj); }]; // 4).反向遍歷,降序遍歷--以數組為例 NSArray *arr4 = @[@"1",@"2",@"3",@"4"]; [arr4 enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSLog(@"%zd--%@",idx,obj); }]; }
優點:1)遍歷時可以直接從block中獲得需要的所有信息,包括下標、值等。特別相對於字典而言,不需要做多餘的編碼即可同時獲得key和value的值。
2)能夠直接修改block中key或者obj的類型為真實類型,可以省去類型轉換的工作。
3)可以通過NSEnumerationConcurrent枚舉值開啟併發迭代功能。
說明:基於Block的遍歷方式在實現反向遍歷的時候也非常簡單,使用enumerateObjectsWithOptions方法,傳遞NSEnumerationReverse作為參數即可,在處理遍歷操作的時候推薦基於Block的遍歷方式。
使用NSEnumerator遍歷,沒有加,因為太多了。。。。