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系统自身定义了很对通知,但是在开发过 ...
随机推荐
- java中Finally块的执行
在try{}catch{}finally{}块中,都知道finally子块是肯定会执行的.当然也有个别情况,当在try{}或者catch{}块中出现强制退出System.exti(int)时,fina ...
- ruby -- 进阶学习(十三)解说ckeditor在production环境下如何完整显示
将ROR项目从development环境改为production环境时,运行rake assets:precompile后, ckeditor的界面就无法完整显示?! @_@?? 出现 ActionC ...
- 比较HTML元素和Native组件的区别
我们开发web应用,会使用到各种Html基本元素,比较<div>,<span>,<img>等. 当我们在开发React Native时,我们不能使用HTML元素,但 ...
- [Python] Symbol Review
From:http://learnpythonthehardway.org/book/ex37.html 1. with X as Y: pass 1.1 yield 2. exec 2.1 name ...
- Python单元测试框架之pytest -- 生成测试报告
继续pytest单元测试框架的学习,pytest可以生成多种类型的测试报告.这一节就来学习pytest如何生成测试报告. 创建test_calss.py 测试用例文件,这里以测试该文件为例. #cod ...
- Gulp.js - 简单、直观的自动化项目构建工具
Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...
- JS基础---->js中ajax的使用
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.今天我们就简单的学习一下ajax的使用及过程. ajax的使用 先贴出大致的代码,是请求本地的一个servlet,返回json格 ...
- 关于解决JQUERY对INPUT元素Change事件不兼容的问题
最近开发一个项目,需要实现用户在WEB表单里的多个INPUT框中输入数量后,立即自动计算加总各项输入的数量之和,并显示在指定的INPUT框中,这个功能实现的原理是简单的,就是只需要在INPUT的onc ...
- ASP.NET身份验证
Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验 证用的最多,也最灵活. Forms 验证方式对基于用户的验证 ...
- iOS实现图像指定区域模糊
在大多图像处理中,我们会应用到高斯模糊处理图像,通常用它来减少图像噪声以及降低细节层次.在此文中介绍了高斯模糊的实现和可选区域的模糊[美图秀秀-背景虚化] 高斯模糊的原理中,它是根据高斯曲线调节像素色 ...