iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

  说明:

  1)该文简短介绍在iOS开发中遍历字典、数组和集合的几种常见方式。

  2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Code

一、使用for循环

  要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下: 

 //普通的for循环遍历
-(void)iteratorWithFor
{
//////////处理数组//////////
NSArray *arrayM = @[@"",@"",@"",@""];
NSInteger arrayMCount = [arrayM count];
for (int i = ; i<arrayMCount; i++) {
NSString *obj = arrayM[i];
NSLog(@"%@",obj);
} //////////处理字典//////////
NSDictionary *dictM = @{@"":@"one",@"":@"two",@"":@"three"};
NSArray *dictKeysArray = [dictM allKeys];
for (int i = ; i<dictKeysArray.count; i++) {
NSString *key = dictKeysArray[i];
NSString *obj = [dictM objectForKey:key];
NSLog(@"%@:%@",key,obj);
} //////////处理集合//////////
NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSArray *setObjArray = [setM allObjects];
for (int i = ; i<setObjArray.count; i++) {
NSString *obj = setObjArray[i];
NSLog(@"%@",obj);
} //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"",@"",@"",@""];
NSInteger arrayMCount2 = [arrayM2 count] - ; for (NSInteger i = arrayMCount2; i>; i--) {
NSString *obj = arrayM2[i];
NSLog(@"%@",obj);
}
}

优点:简单

缺点:由于字典和集合内部是无序的,导致我们在遍历字典和集合的时候需要借助一个新的『数组』作为中介来处理,多出了一部分开销。

二、使用NSEnumerator遍历

NSEnumerator的使用和基本的for循环类似,不过代码量要大一些。示例如下:

 //使用NSEnumerator遍历
-(void)iteratorWithEnumerator
{
//////////处理数组//////////
NSArray *arrayM = @[@"",@"",@"",@""];
NSEnumerator *arrayEnumerator = [arrayM objectEnumerator];
NSString *obj;
while ((obj = [arrayEnumerator nextObject]) != nil) {
NSLog(@"%@",obj);
} //////////处理字典//////////
NSDictionary *dictM = @{@"":@"one",@"":@"two",@"":@"three"};
NSEnumerator *dictEnumerator = [dictM keyEnumerator];
NSString *key;
while ((key = [dictEnumerator nextObject]) != nil) {
NSString *obj = dictM[key];
NSLog(@"%@",obj);
} //////////处理集合//////////
NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSEnumerator *setEnumerator = [setM objectEnumerator];
NSString *setObj;
while ((setObj = [setEnumerator nextObject]) != nil) {
NSLog(@"%@",setObj);
} //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"",@"",@"",@""];
NSEnumerator *arrayEnumerator2 = [arrayM2 reverseObjectEnumerator];
NSString *obj2;
while ((obj2 = [arrayEnumerator2 nextObject]) != nil) {
NSLog(@"%@",obj2);
} }

优点:对于不同的数据类型,遍历的语法相似;内部可以简单的通过reverseObjectEnumerator设置进行反向遍历。

缺点:代码量稍大。

三、使用for...In遍历

在Objective-C 2.0 中增加了for ...In 形式的快速遍历。此种遍历方式语法简洁,速度飞快。示例如下:

 //使用for...In进行快速遍历
-(void)iteratorWithForIn
{
//////////处理数组//////////
NSArray *arrayM = @[@"",@"",@"",@""];
for (id obj in arrayM) {
NSLog(@"%@",obj);
} //////////处理字典//////////
NSDictionary *dictM = @{@"":@"one",@"":@"two",@"":@"three"};
for (id obj in dictM) {
NSLog(@"%@",dictM[obj]);
} //////////处理集合//////////
NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
for (id obj in setM) {
NSLog(@"%@",obj);
} //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"",@"",@"",@""];
for (id obj in [arrayM2 reverseObjectEnumerator]) {
NSLog(@"%@",obj);
}
}

优点:1)语法简洁;2)效率最高;

缺点:无法获得当前遍历操作所针对的下标。

四、基于Block的遍历方式

基于Block的方式来进行遍历是最新引入的方法。它提供了遍历数组|字典等类型数据的最佳实践。示例如下:

 //基于块(block)的遍历方式
-(void)iteratorWithBlock
{
//////////处理数组//////////
NSArray *arrayM = @[@"",@"",@"",@""];
[arrayM enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%zd--%@",idx,obj);
}]; //////////处理字典//////////
NSDictionary *dictM = @{@"":@"one",@"":@"two",@"":@"three"};
[dictM enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@:%@",key,obj);
}]; //////////处理集合//////////
NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
[setM enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@",obj);
}]; //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"",@"",@"",@""];
[arrayM2 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的遍历方式。

五、使GCD中的dispatch_apply函数

  使用GCD中的dispatch_apply函数也能实现字典、数组等的遍历,该函数比较适合处理耗时较长、迭代次数较多的情况。示例如下:

 //使用GCD中的dispatch_apply函数
-(void)iteratorWithApply
{
//////////处理数组//////////
NSArray *arrayM = @[@"",@"",@"",@""]; //获得全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(, ); dispatch_apply(arrayM.count, queue, ^(size_t index) {
NSLog(@"%@--%@",arrayM[index],[NSThread currentThread]);
});
}

优点:开启多条线程并发处理遍历任务,执行效率高。

缺点:1)对于字典和集合的处理需借助数组;2)无法实现反向遍历。

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式的更多相关文章

  1. iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示

    iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端.  打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面.   ...

  2. iOS开发实用技巧—项目新特性页面的处理

    iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...

  3. iOS开发小技巧 - UILabel添加中划线

    iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...

  4. iOS开发小技巧--微博项目中的键盘工具条

    微博项目中的键盘工具条 项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图: 所以,果断决定将工具 ...

  5. iOS开发小技巧--初始化项目中修改APP安装后的名称

  6. iOS 学习 - 6.Objective-C中的各种遍历(迭代)方式

    说明:转自文顶顶 一.使用 for 循环 要遍历字典.数组或者是集合,for 循环是最简单也用的比较多的方法 -(void)iteratorWithFor { //////////处理数组////// ...

  7. iOS开发小技巧 - runtime适配字体

    iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...

  8. iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明

    ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...

  9. ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明

    ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...

随机推荐

  1. npoi实现 从固定的行读取数据作为表头并返回datable

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. iptables配置允许vpnserver(softether vpn)

    防火墙配置 -A INPUT -p udp -m multiport --dport ,,,, -j ACCEPT

  3. Java 基本数据类型长度

    System.out.println(Integer.MAX_VALUE-(-Integer.MAX_VALUE)); //内存溢出System.out.println(Integer.MAX_VAL ...

  4. 浪潮不能进bios解决过程

    开机时会有个提示一闪而过,经过拍摄视频观看发现是"Press DEL to SETUP or TAP to post" 但是,反复重启不停按Delete键都无效,都进入了Ctrl+ ...

  5. hd2066一个人的旅行

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...

  6. centos的安装,网络的调试

    因业务需要,我今天尝试为公司服务器安装centos,选择的版本是6.7 第一步,下载:http://isoredirect.centos.org/centos/6/isos/x86_64/

  7. 响应式Web设计(Responsive Web design)的理念

    页面的设计与开发应当根据用户行为以及设备环境(系统平台.屏幕尺寸.屏幕定向等)进行相应的响应和调整.具体的实践方式由多方面组成,包括弹性网格和布局.图片.CSS media query的使用等.无论用 ...

  8. 热烈庆祝杨学明老师为苏宁、中兴、烽火、CNNIC、创维、金立、中航信等知名企业提供培训和咨询服务!

    在2015年三季度,研发资深顾问.资深讲师杨学明先生为国内多家名企提供了培训和咨询服务!由于杨学明老师在软件及互联网方面的管理经验极为丰富,被多家公司选为首席研发讲师!并聘为常年顾问!

  9. 关于 pgsql 数据库json几个函数用法的效率测试

    关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...

  10. 个性二维码开源专题<替换定位点>

    基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // F ...