iOS中的遍历(数组NSArray,字典NSDictionary,集合NSSet)

转自:http://blog.youkuaiyun.com/gbb123456/article/details/51062947
遍历是我们在代码中经常用到的。下面我总结了在collection中经常用到的四种遍历方式

假设数组为:

[objc]  view plain  copy
  1. NSArray *array = @[@"恭"@"喜"@"发"@"财"];  
[objc]  view plain  copy
  1. <pre name="code" class="objc">NSDictionary *dictionary = @{@"新":@"年"@"大":@"吉"};  
[objc]  view plain  copy
  1. <pre name="code" class="objc">NSSet *set = [NSSet setWithObjects:@"身"@"体"@"健"@"康", nil nil];  

 
 

第一种:for循环

数组遍历

[objc]  view plain  copy
  1. for (int i = 0; i < array.count; i++)  
  2.     {  
  3.         NSLog(@"object = %@", array[i]);  
  4.     }  
字典 遍历

[objc]  view plain  copy
  1. NSArray *keys = [dictionary allKeys];  
  2.       
  3.     for (int i = 0; i < keys.count; i++)  
  4.     {  
  5.         NSLog(@"object = %@", dictionary[keys[i]]);  
  6.     }  
集合遍历
[objc]  view plain  copy
  1. NSArray *objects = [set allObjects];  
  2.       
  3.     for (int i = 0; i < objects.count; i++)  
  4.     {  
  5.         NSLog(@"object = %@", objects[i]);  
  6.     }  
我们发现,在遍历字典和set时,先定义了一个数组,因为根据定义,字典和set都是“无序的”,所以无法根据特定的整数下标来直接访问其中的值。于是,就必须先获取字典里的所有键或是set里的所有对象。

第二种:Objective-C 1.0的NSEnumerator来遍历

NSEnumerator有两个方法 -(NSArray*)allObjects;    -(id)nextObject;  nextObject可以返回枚举里的下个对象,等到枚举中的全部对象都已返回,在调用就返回nil。

数组遍历

[objc]  view plain  copy
  1. NSEnumerator *enumerator = [array objectEnumerator];  
  2. id object;  
  3.       
  4.     while ((object = [enumerator nextObject]) != nil)  
  5.     {  
  6.         NSLog(@"%@", object);  
  7.     }  
set遍历

[objc]  view plain  copy
  1. NSEnumerator *enumerator = [set objectEnumerator];  
  2.     id object;  
  3.       
  4.     while ((object = [enumerator nextObject]) != nil)  
  5.     {  
  6.         NSLog(@"%@", object);  
  7.     }  
字典遍历
[objc]  view plain  copy
  1. NSEnumerator *enumerator = [dictionary keyEnumerator];  
  2.       
  3.     id key;  
  4.       
  5.     while ((key = [enumerator nextObject]) != nil)  
  6.     {  
  7.         NSLog(@"%@", [dictionary objectForKey:key]);  
  8.     }  
遍历字典的方式与数组或set略有不同,因为字 典里既有键 也有值,所以要根据给定的键把对应的值提取出来。

第三种:快速遍历 (在for循环里开设了in关键字)

数组遍历

[objc]  view plain  copy
  1. for (id object in array)  
  2.     {  
  3.         NSLog(@"%@", object);  
  4.     }  
字典遍历

[objc]  view plain  copy
  1. for (id key in dictionary)  
  2.     {  
  3.         NSLog(@"%@", dictionary[key]);  
  4.     }  
set遍历
[objc]  view plain  copy
  1. for (id object in set)  
  2.     {  
  3.         NSLog(@"%@", object);  
  4.     }  
第四种:基于块的遍历方式
数组遍历

[objc]  view plain  copy
  1. [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {  
  2.        NSLog(@"index = %lu, object = %@", (unsigned long)idx, obj);  
  3.    }];  

字典遍历

[objc]  view plain  copy
  1. <span style="font-size:14px;">[dictionary enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOLBOOL * _Nonnull stop) {  
  2.         NSLog(@"key = %@, value = %@", key, obj);  
  3.     }];</span>  

-(void)enumerateObjectsUsingBlock:(void(^)(id Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)) block,这个块有三个参数,分别是当前迭代针对的对象,所针对的下标,以及指向布尔值的指针,通过第三个参数所提供的机制,开发者可以终止遍历操作。

基于块的枚举有点在于:本身就能通过GCD来并发执行遍历操作,无需另行编写代码。遍历数组时,可以知道当前所针对的下标,遍历字典时,无需额外编码,即可同时获取键和值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值