标签:
本文转自文顶顶,稍加修改
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遍历,没有加,因为太多了。。。。
标签:
原文地址:http://www.cnblogs.com/asamu/p/5369656.html