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

  说明:

  1)该文简短介绍在iOS开发中遍历字典、数组和集合的几种常见方式。

  2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Code

一、使用for循环

  要遍历字典、数组或者是集合,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);
}
}

优点:简单

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

二、使用NSEnumerator遍历

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

 //使用NSEnumerator遍历
-(void)iteratorWithEnumerator
{
//////////处理数组//////////
NSArray *arrayM = @[@"",@"",@"",@""];
NSEnumerator *arrayEnumerator = [arrayM objectEnumerator];
NSString *obj;
while ((obj = [arrayEnumerator nextObject]) != nil) {
NSLog(@"%@",obj);
} //////////处理字典//////////
NSDictionary *dictM = @{@"":@"one",@"":@"two",@"":@"three"};
NSEnumerator *dictEnumerator = [dictM keyEnumerator];
NSString *key;
while ((key = [dictEnumerator nextObject]) != nil) {
NSString *obj = dictM[key];
NSLog(@"%@",obj);
} //////////处理集合//////////
NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSEnumerator *setEnumerator = [setM objectEnumerator];
NSString *setObj;
while ((setObj = [setEnumerator nextObject]) != nil) {
NSLog(@"%@",setObj);
} //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"",@"",@"",@""];
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 = @[@"",@"",@"",@""];
for (id obj in arrayM) {
NSLog(@"%@",obj);
} //////////处理字典//////////
NSDictionary *dictM = @{@"":@"one",@"":@"two",@"":@"three"};
for (id obj in dictM) {
NSLog(@"%@",dictM[obj]);
} //////////处理集合//////////
NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
for (id obj in setM) {
NSLog(@"%@",obj);
} //////////反向遍历----降序遍历----以数组为例
NSArray *arrayM2 = @[@"",@"",@"",@""];
for (id obj in [arrayM2 reverseObjectEnumerator]) {
NSLog(@"%@",obj);
}
}

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

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

四、基于Block的遍历方式

基于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"};
[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函数也能实现字典、数组等的遍历,该函数比较适合处理耗时较长、迭代次数较多的情况。示例如下:

 //使用GCD中的dispatch_apply函数
-(void)iteratorWithApply
{
//////////处理数组//////////
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开发实用技巧—Objective-C中的各种遍历(迭代)方式的更多相关文章

  1. iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示

    iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端.  打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面.   ...

  2. iOS开发实用技巧—项目新特性页面的处理

    iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...

  3. iOS开发小技巧 - UILabel添加中划线

    iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...

  4. iOS开发小技巧--微博项目中的键盘工具条

    微博项目中的键盘工具条 项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图: 所以,果断决定将工具 ...

  5. iOS开发小技巧--初始化项目中修改APP安装后的名称

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

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

  7. iOS开发小技巧 - runtime适配字体

    iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...

  8. iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明

    ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...

  9. ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明

    ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...

随机推荐

  1. Oracle游标带参数

    Oracle游标是可以带参数的,而SqlServer的游标就不可以了 create or replace procedure a as cursor b(c_id int)is select * fr ...

  2. jquery中html()、text()、val()的区别与使用

    .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. .html(),.text(),.val()三种方法都 ...

  3. [linux]linux普通用户安装rpm软件

    先下载rpm文件 yumdownloader xxxx.rpm 直接wget等其他方式下载也可以. 解压 rpm2cpio xxxx.rpm |cpio -idvm 修改环境变量 将新增的软件的可执行 ...

  4. Apache配置多域名 AH00548: NameVirtualHost has no effect and will be removed in the next release

    httpd-vhosts.conf 中首行 NameVirtualHost *:80 删除掉即可解决.

  5. Android音频系统之AudioFlinger(四)

    http://blog.csdn.net/xuesen_lin/article/details/8805096 1.1.1 AudioMixer 每一个MixerThread都有一个唯一对应的Audi ...

  6. 【半平面交】bzoj2618 [Cqoi2006]凸多边形

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  7. 一些CSS常见的小问题小笔记

    父元素与子元素之间的margin-top问题: 给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值 解决方法: 1.修改父元素的高度,增加padding-to ...

  8. java实验一 20135104刘帅

    实验报告 一.实验目的与要求: 实验目的: 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 实验要求: 1.没有Linux基础的同学建议先学习 ...

  9. MSTest、NUnit、xUnit.net 属性和断言对照表

    MSTest.NUnit.xUnit.net 属性对照表 MSTest NUnit xUnit.net Comments [TestMethod] [Test] [Fact] Marks a test ...

  10. 收缩SQL Server日志不是那么简单的(翻译)

    原文地址:http://rusanu.com/2012/07/27/how-to-shrink-the-sql-server-log/ 说明:本文为了更好的说明收缩的过程,在原文翻译的基础上增加了一些 ...