7、Objective-C中的各种遍历(迭代)方式
一、使用for循环
要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下:
//普通的for循环遍历
-(void)iteratorWithFor
{
//////////处理数组//////////
NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
NSInteger arrayMCount = [arrayM count];
for (int i = 0; i<arrayMCount; i--) {
NSString *obj = arrayM2[i]; NSLog(@"%@",obj);
}
}
优点:简单
缺点:由于字典和集合内部是无序的,导致我们在遍历字典和集合的时候需要借助一个新的『数组』作为中介来处理,多出了一部分开销。
二、使用NSEnumerator遍历
NSEnumerator的使用和基本的for循环类似,不过代码量要大一些。示例如下:
//使用NSEnumerator遍历
-(void)iteratorWithEnumerator
{
//////////处理数组//////////
NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
NSEnumerator *arrayEnumerator = [arrayM objectEnumerator];
NSString *obj;
while ((obj = [arrayEnumerator nextObject]) != nil) {
NSLog(@"%@",obj);
}
//////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
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 = @[@"1",@"2",@"3",@"4"];
for (id obj in arrayM) {
NSLog(@"%@",obj);
}
//////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
for (id obj in [arrayM2 reverseObjectEnumerator]) {
NSLog(@"%@",obj);
}
}
优点:1)语法简洁;2)效率最高;
缺点:无法获得当前遍历操作所针对的下标
四、基于Block的遍历方式
基于Block的方式来进行遍历是最新引入的方法。它提供了遍历数组字典等类型数据的最佳实践。示例如下:
//基于块(block)的遍历方式
-(void)iteratorWithBlock
{
//////////处理数组//////////
NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
[arrayM enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%zd--%@",idx,obj);
}];
//////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
[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 = @[@"1",@"2",@"3",@"4"];
//获得全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_apply(arrayM.count, queue, ^(size_t index) {
NSLog(@"%@--%@",arrayM[index],[NSThread currentThread]);
});
}
优点:开启多条线程并发处理遍历任务,执行效率高。
缺点:1)对于字典和集合的处理需借助数组;2)无法实现反向遍历。
7、Objective-C中的各种遍历(迭代)方式的更多相关文章
- iOS 学习 - 6.Objective-C中的各种遍历(迭代)方式
说明:转自文顶顶 一.使用 for 循环 要遍历字典.数组或者是集合,for 循环是最简单也用的比较多的方法 -(void)iteratorWithFor { //////////处理数组////// ...
- java中对HashMap遍历的方式
第一种是利用HashMap的entrySet()方法: Map<String,String> map = new HashMap<String,String>(); Itera ...
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- ios-Objective-C中的各种遍历(迭代)方式(转载)
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- 细说java中Map的两种迭代方式
曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...
- Opencv中图像的遍历与像素操作
Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...
- Java中map接口 遍历map
转自:https://www.cnblogs.com/wjk921/p/4918442.html java集合框架用于存储数据,也被称为集合类 位于java.util包下 java.util包下常用接 ...
- c++ 二叉树的遍历(迭代,递归)
#include<iostream> #include <algorithm> #include <vector> #include <set> #in ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
随机推荐
- ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇]
ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇] ASP.NET Web API服务端框架核心是一个独立于具体寄宿环境的消息处理管道,它不关心请求消息来源于何 ...
- .net 配置文件 分析 EntityName 时出错
今天用C#读写XML文档,总出现下面的错误: 分析 EntityName 时出错.行1,位置9. 出错地方的源程序为: //...... pathEle.InnerXml = reducedStr(v ...
- 了解OData(一)
了解OData(一) 最近做了一个小项目,其中用到了 WCF Data Service,之前是叫 ADO.NET Data Service 的.关于WCF Data Service,博客园里的介绍并不 ...
- 使用ResourceDictionary管理Logical Resources
WPF整理-使用ResourceDictionary管理Logical Resources “Logical resources may be of various types, such as br ...
- 初识sql server 2000-数据库的连接
这段时间主要进行学生信息管理系统的实现,所以与数据库打交道是难免的,我也是刚敲过5个数据库例子的小鸟,对数据库的理解还欠佳,不足之处大鸟飞过还请指点. 安装完sql server2000之后,首先要做 ...
- Java-调用抽象类中指定参数的构造方法
abstract class person { private String name; private int age; public person(String name,int age) ...
- C语言之循环结构 for(一)
一 for循环的介绍 语法: for(表达式1;表达式2;表达式3){ 循环体; } 循环步骤: A.执行表达式1,执行完毕跳转到B B.判断表达式2的结果是否为真,如果为真,跳转到C,否则跳转到E ...
- vim编辑器的简单使用
写这篇文章是因为在更新我的一篇博客 Git的其他用法 的时候,里面的修改已经提交的commit说明这一部分需要用到vim. 在使用git config --global --edit或者git reb ...
- Unity3D 浏览工具
键盘控制: 1.键盘箭头:先选中场景激活场景 按箭头前后左右 shift +箭头 加速移动 2.使物体成为场景焦点:左侧层次视图列表选中物体,移动鼠标指针到场景视图上 按F,选中物体成为场景视图中心 ...
- GridView Tab/Enter键插入新行
此段代码是从DevExpress官方回复文件中得到的.可以用来优化GridView的操作体验. /// <summary> /// GridView添加新行 /// </summar ...