一、使用for循环

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

  1. //普通的for循环遍历
  2. -(void)iteratorWithFor
  3. {
  4. //////////处理数组//////////
  5. NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
  6. NSInteger arrayMCount = [arrayM count];
  7. for (int i = 0; i<arrayMCount; i--) {
        NSString *obj = arrayM2[i]; NSLog(@"%@",obj);
       }
    }

  优点:简单

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

二、使用NSEnumerator遍历

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

  1. //使用NSEnumerator遍历
  2. -(void)iteratorWithEnumerator
  3. {
  4. //////////处理数组//////////
  5. NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
  6. NSEnumerator *arrayEnumerator = [arrayM objectEnumerator];
  7. NSString *obj;
  8. while ((obj = [arrayEnumerator nextObject]) != nil) {
  9. NSLog(@"%@",obj);
  10. }
  1.     //////////反向遍历----降序遍历----以数组为例
  2. NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
  3. NSEnumerator *arrayEnumerator2 = [arrayM2 reverseObjectEnumerator];
  4. NSString *obj2;
  5. while ((obj2 = [arrayEnumerator2 nextObject]) != nil) {
  6. NSLog(@"%@",obj2);
  7. }
  8. }

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

  缺点:代码量稍大。

三、使用for...In遍历

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

  1. //使用for...In进行快速遍历
  2. -(void)iteratorWithForIn
  3. {
  4. //////////处理数组//////////
  5. NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
  6. for (id obj in arrayM) {
  7. NSLog(@"%@",obj);
  8. }
  1.     //////////反向遍历----降序遍历----以数组为例
  2. NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
  3. for (id obj in [arrayM2 reverseObjectEnumerator]) {
  4. NSLog(@"%@",obj);
  5. }
  6. }

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

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

四、基于Block的遍历方式

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

  1. //基于块(block)的遍历方式
  2. -(void)iteratorWithBlock
  3. {
  4. //////////处理数组//////////
  5. NSArray *arrayM = @[@"1",@"2",@"3",@"4"];
  6. [arrayM enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  7. NSLog(@"%zd--%@",idx,obj);
  8. }];
  1.     //////////反向遍历----降序遍历----以数组为例
  2. NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];
  3. [arrayM2 enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  4. NSLog(@"%zd--%@",idx,obj);
  5. }];
  6. }

  优点:1)遍历时可以直接从block中获得需要的所有信息,包括下标、值等。特别相对于字典而言,不需要做多余的编码即可同时获得key和value的值。

  2)能够直接修改block中key或者obj的类型为真实类型,可以省去类型转换的工作。

  3)可以通过NSEnumerationConcurrent枚举值开启并发迭代功能。

  说明:基于Block的遍历方式在实现反向遍历的时候也非常简单,使用enumerateObjectsWithOptions方法,传递NSEnumerationReverse作为参数即可,在处理遍历操作的时候推荐基于Block的遍历方式。

五、使GCD中的dispatch_apply函数

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

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

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

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

  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  

7、Objective-C中的各种遍历(迭代)方式的更多相关文章

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

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

  2. java中对HashMap遍历的方式

    第一种是利用HashMap的entrySet()方法: Map<String,String> map = new HashMap<String,String>(); Itera ...

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

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  4. ios-Objective-C中的各种遍历(迭代)方式(转载)

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  5. 细说java中Map的两种迭代方式

    曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...

  6. Opencv中图像的遍历与像素操作

    Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...

  7. Java中map接口 遍历map

    转自:https://www.cnblogs.com/wjk921/p/4918442.html java集合框架用于存储数据,也被称为集合类 位于java.util包下 java.util包下常用接 ...

  8. c++ 二叉树的遍历(迭代,递归)

    #include<iostream> #include <algorithm> #include <vector> #include <set> #in ...

  9. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  10. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

随机推荐

  1. jQuery Mobile (中)

    jQuery Mobile (中) 前言 昨天我们一起学习了一部分jquery mobile的知识,今天我们继续. 这些是些很基础的东西,有朋友觉得这个没有其它的好,但是学习下不吃亏嘛,我反正也不会一 ...

  2. flask 真是太棒啦,阅读手册后就能做出一个博客了

    真是很好的东西,有很多有益处的东西. 有template引擎, 有flask自己带的g (用来处理访问与数据库打开关闭的) 有flask自己的处理session的功能 自带的jinja2模板引擎也是比 ...

  3. Django入门实践(一)

    Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...

  4. zoj 1152 A Mathematical Curiosity

    方法:枚举 做这道题,在第十行的位置WA了很多次,(n || m)不能写成(n + m),m可能是负数,一直没注意到,导致不停的WA....... #include <stdio.h> i ...

  5. Windows平台下的node.js安装

    Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应 ...

  6. Java之路——Java初接触

    本文大纲 1.Java是什么 2.Java历史 3.Java技术范围 3.1 Java SE平台技术范围 3.2 Java EE技术范围 3.3 Java 体系技术范围 4.总结 1.Java是什么 ...

  7. Epicor系统二次开发

    Epicor系统二次开发 一.获取或修改界面EpiDataView的字段数据(Get EpiDataView data) C# EpiDataView edv = (EpiDataView)oTran ...

  8. asp.net core + mysql + ef core + linux

    asp.net core + mysql + ef core + linux 以前开发网站是针对windows平台,在iis上部署.由于这次需求的目标服务器是linux系统,就尝试用跨平台的.NET ...

  9. 使用gulp构建自动化工作流

    简单易用 高效构建 高质量的生态圈 可能很多人会说现在提gulp也太落后了吧,但我想说写点东西并不是为了讨论它是否过时,而是来帮助我们自己来记忆.整理和学习.任何工具,我需要,我才去使用它,正如此时我 ...

  10. JSON反序列化实体类

    1.定义实体类 [DataContract] public class CustomerWordOrderViewModel { [DataMember] public string Name; [D ...