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世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
随机推荐
- jQuery Mobile (中)
jQuery Mobile (中) 前言 昨天我们一起学习了一部分jquery mobile的知识,今天我们继续. 这些是些很基础的东西,有朋友觉得这个没有其它的好,但是学习下不吃亏嘛,我反正也不会一 ...
- flask 真是太棒啦,阅读手册后就能做出一个博客了
真是很好的东西,有很多有益处的东西. 有template引擎, 有flask自己带的g (用来处理访问与数据库打开关闭的) 有flask自己的处理session的功能 自带的jinja2模板引擎也是比 ...
- Django入门实践(一)
Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...
- zoj 1152 A Mathematical Curiosity
方法:枚举 做这道题,在第十行的位置WA了很多次,(n || m)不能写成(n + m),m可能是负数,一直没注意到,导致不停的WA....... #include <stdio.h> i ...
- Windows平台下的node.js安装
Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应 ...
- Java之路——Java初接触
本文大纲 1.Java是什么 2.Java历史 3.Java技术范围 3.1 Java SE平台技术范围 3.2 Java EE技术范围 3.3 Java 体系技术范围 4.总结 1.Java是什么 ...
- Epicor系统二次开发
Epicor系统二次开发 一.获取或修改界面EpiDataView的字段数据(Get EpiDataView data) C# EpiDataView edv = (EpiDataView)oTran ...
- asp.net core + mysql + ef core + linux
asp.net core + mysql + ef core + linux 以前开发网站是针对windows平台,在iis上部署.由于这次需求的目标服务器是linux系统,就尝试用跨平台的.NET ...
- 使用gulp构建自动化工作流
简单易用 高效构建 高质量的生态圈 可能很多人会说现在提gulp也太落后了吧,但我想说写点东西并不是为了讨论它是否过时,而是来帮助我们自己来记忆.整理和学习.任何工具,我需要,我才去使用它,正如此时我 ...
- JSON反序列化实体类
1.定义实体类 [DataContract] public class CustomerWordOrderViewModel { [DataMember] public string Name; [D ...