iOS 学习 - 6.Objective-C中的各种遍历(迭代)方式
说明:转自文顶顶
一、使用 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);
}
}
优点:简单
缺点:由于字典和集合内部是无序的,导致我们在遍历字典和集合的时候需要借助一个新的【数组】作为中介来处理,多出一部分开支
二、使用 for...in遍历
在Objective-C 2.0 中增加了 for...in 形式的快速遍历,此种遍历方式语法简洁,速度飞快。
//-->处理数组
NSArray *arrayM = @[@"",@"",@"",@""];
for (id obj in arrayM) {
NSLog(@"%@",obj);
}
//-->处理字典(有序)
NSDictionary *dictM = @{@"":@"one",@"":@"two",@"":@"three",@"":@"four"};
NSArray *array = [dictM allKeys];
NSArray *sortArray = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
for (id obj in sortArray) {
NSLog(@"%@",dictM[obj]);
}
优点:1)语法简洁;2)效率最高
缺点:无法获得当前遍历操作所针对的下标。
三、基于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",@"":@"four"};
[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函数也能实现字典、数组等的遍历,该函数比较适合处理耗时较长、迭代次数较多的情况。示例如下:
-(void)iteratorWithAplly{
//-->处理数组
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 学习 - 6.Objective-C中的各种遍历(迭代)方式的更多相关文章
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- 【iOS学习笔记】UITextField中的输入检测——限制只能输入数字和小数点
最近趁着放假时间,在看The Big Nerd Ranch的iOS编程,想着重新复习一遍iOS开发的基础知识 于是从这一篇开始记录一些学习过程中遇到的小问题 书中第四章有一个温度转换的app实现,整体 ...
- IOS学习:在工程中添加百度地图SDK
1.将下载下来的sdk中的inc文件夹.mapapi.bundle.libbaidumapapi.a添加到工程中,其中libbaiduapi.a有两个,一个对应模拟器一个对应真机,导入方法如下: 第一 ...
- 【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结
从上一篇的springmvc入门中已经看到,springmvc.xml中的配置了映射器和适配器,是使用非注解的方式来配置的,这是非注解方式的一种,这里再复习一下: 1. 非注解方式 1.1 处理器适配 ...
- java中对HashMap遍历的方式
第一种是利用HashMap的entrySet()方法: Map<String,String> map = new HashMap<String,String>(); Itera ...
- ios-Objective-C中的各种遍历(迭代)方式(转载)
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...
- iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决
最近在项目中经常用到UITableView中的cell中带有UITextField或UITextView的情况,然后在这种场景下,当我们点击屏幕较下方的cell进行编辑时,这时候键盘弹出来会出现遮挡待 ...
- iOS学习——(转)iOS中关于通知的使用
在移动端开打过程中,经常会用到通知和推送,例如有短信来了需要通知提示,手机横屏了需要通知提示,插上耳机了需要通知提示等等,我们可以根据这些通知采取对应的动作.iOS系统自身定义了很对通知,但是在开发过 ...
随机推荐
- JS&CSS文件请求合并及压缩处理研究(三)
上篇我们进行了一些代码方面的准备工作.接下来的逻辑是:在View页面解析时,通过 Html.AppendResFile 方法添加的资源文件,我们需要按照分组.优先级,文件名等条件,对其路径进行合并.具 ...
- sysbench测试服务器性能
sysbench目前已经有0.5的版本,不过最普遍使用的依旧是0.4.12,所以接下来我们会以0.4.12这个版本作为测试 Step1:下载安装sysbench wget http://pkgs.fe ...
- IE11之F12 Developer Tools--控制台工具(Console)
前面我们介绍了IE11的Developer Tools中的第一个工具--DOM Explorer,这篇文章介绍第二个工具--控制台(Console),使用控制台工具查看错误和其他信息.发送调试输出.检 ...
- MyBatis动态SQL使用,传入参数Map中的Key判断
<select id="" parameterType="Map" resultMap="commodityResultMap" &g ...
- 【Win10】使用 ValidationAttribute 实现数据验证
WPF 中数据验证的方式多种多样,这里就不说了.但是,在 Windows Phone 8.1 Runtime 中,要实现数据验证,只能靠最基础的手动编写条件判断代码来实现.如果用过 ASP.NET M ...
- dp --- 2014 Asia AnShan Regional Contest --- HDU 5074 Hatsune Miku
Hatsune Miku Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5074 Mean: 有m种音符(note),现在要从 ...
- 关于URL、Web的一些概念
关于URL ★ 书写路径时,网络文件用斜杠“/”划分不同层级,本地文件管理系统用反斜杠“\”,分隔不同层级: 如下图示 ★ 绝对/相对 ...
- oracle触发器类型
http://www.cnblogs.com/roucheng/p/3506033.html 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异 ...
- PHP mail
PHP 允许您从脚本直接发送电子邮件. PHP mail() 函数 PHP mail() 函数用于从脚本中发送电子邮件. 语法 mail(to,subject,message,headers,para ...
- 【C#进阶系列】04 类型基础
关于System.Object 所有类型都从System.Object派生而来. System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后 ...