标准的C语言for循环、Objective-C 1.0出现的NSEnumerator、Objective-C 1.0出现的for in快速遍历、块遍历。

遍历的话,一般是NSArray、NSDictionary、NSSet和自定义的collection。


0、初始化数据

NSArray *array = @[@"ele1", @"ele2", @"ele3", @"ele4"];
NSDictionary *dict = @{@"name" : @"xiaohong", @"age" : @"", @"gendar" : @"woman"};

1、使用for循环

// 遍历数组
for (int i = ; i < array.count; i++) {
NSString *eleString = [array objectAtIndex:i];
NSLog(@"%@", eleString);
}
// 遍历字典
for (int i = ; i < dict.count; i++) {
NSString *valueString = [dict.allValues objectAtIndex:i];
NSLog(@"%@", valueString);
}
// 附加:使用枚举块,forin也能反向遍历
for (NSString *eleString in [array reverseObjectEnumerator]) {
NSLog(@"%@", eleString);
}

2、使用for-in遍历。特点是简洁、高效。但是注意不要在forin循环体中对元素进行修改

// 遍历数组
for (NSString *eleString in array) {
NSLog(@"%@", eleString);
}
// 遍历字典
for (NSString *valueString in dict.allValues) {
NSLog(@"%@", valueString);
}
// 注意:
for (NSString *keyString in dict) {
// keyString就是dict中的key值
}

3、使用枚举器遍历

// 遍历数组
// 为这个数组生成一个顺序的枚举器,reverseObjectEnumerator为倒序枚举器
NSEnumerator *arrayEnumerator = [array objectEnumerator];
// 不能使用NSString *string = nil
NSString *string = @"";
while (string) {
string = [arrayEnumerator nextObject];
if (string != nil) {
NSLog(@"%@", string);
}
}
// 遍历字典
// 为这个字典生成一个遍历key的枚举器,objectEnumerator为遍历value的枚举器
NSEnumerator *dictKeyEnumerator = [dict keyEnumerator];
// 不能使用NSString *string = nil
NSString *keyString = @"";
while (keyString) {
keyString = [dictKeyEnumerator nextObject];
if (keyString != nil) {
NSLog(@"%@", keyString);
}
}
// 附加:使用枚举块,forin也能反向遍历
for (NSString *eleString in [array reverseObjectEnumerator]) {
NSLog(@"%@", eleString);
}

4、基于块枚举。handler中的参数类型和形参名都是可以进行更改的,这样就省去了手动强制转换代码。

// 枚举数组
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if (idx == array.count - ) {
*stop = YES;
}
}];
// 反向遍历数组
[array enumerateObjectsWithOptions:NSEnumerationReverse
usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if (idx == array.count - ) {
*stop = YES;
}
}];
// 枚举字典
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([key isEqualToString:@"name"]) {
*stop = YES;
}
}];
// 反向遍历字典
// 需要注意的是:只有在遍历数组或者有序set等有顺序的collection时,反向遍历才有意义。

OC中四种遍历方式的更多相关文章

  1. lua中for循环的四种遍历方式

    lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3   key,value pairs 取每一 ...

  2. c++ --> c++中四种类型转换方式

    c++中四种类型转换方式   c风格转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少缺点, 1)它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向 ...

  3. list的四种遍历方式

    1.手先增强for循环和iterator遍历的效果是一样的,也就说 增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容.不能获 ...

  4. Map 的四种遍历方式

    Map 的四种遍历方式 import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class ...

  5. java集合四种遍历方式

    package conection; import java.util.Iterator;import java.util.LinkedList;import java.util.List; publ ...

  6. HashMap 中7种遍历方式的性能分析

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  7. Web.xml中四种验证方式

    源地址:https://blog.csdn.net/imimi_/article/details/78805642 <security-constraint> 的子元素 <http- ...

  8. map的四种遍历方式

    map是Java中非常常用的一种数据结构,但map不同于set和list都继承自Collection接口. 所以map没有实现Collection的Iterator 方法,自身没有迭代器来遍历元素. ...

  9. Java中四种遍历Map对象的方法

    方法一:在for-each循环中使用entry来遍历,通过Map.entrySet遍历key和value,这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Int ...

随机推荐

  1. ZooKeeper-集群模式配置

    (1)下载安装zookeeper,进行基本的配置,详细教程:https://www.cnblogs.com/excellencesy/p/11956485.html (2)在三台虚拟机上分别按照以上方 ...

  2. 使用MQTTBox连接阿里云平台

    这篇只做一个简单的介绍,和上一篇没有根本的区别.只是就两个客户端的差异介绍一下. 一.需要参考的内容: 使用MQTT.fx连接阿里云平台: https://www.cnblogs.com/mhtc/p ...

  3. python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。

    python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...

  4. Python爬虫教程:requests模拟登陆github

    1. Cookie 介绍 HTTP 协议是无状态的.因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信.Cookie 就是「其他手段」之一. Cookie 一个典型的应用场景,就是 ...

  5. SQL语句优化分析

    分析比较执行时间计划读取情况 select * from dbo.Product 执行上面语句一般情况下只给你返回结果和执行行数,那么你怎么分析呢,怎么知道优化之后跟没有优化的区别呢. 下面几种方法: ...

  6. 「题解」「JOISC 2014 Day1」历史研究

    目录 题目 考场思考 思路分析及标程 题目 点这里 考场思考 大概是标准的莫队吧,离散之后来一个线段树加莫队就可以了. 时间复杂度 \(\mathcal O(n\sqrt n\log n)\) . 然 ...

  7. left join 、right join 和inner join之间的区别

    SQL的left join .right join 和inner join之间的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join(右联接) ...

  8. Java学习资源 - 底层

    指路明灯 一位资深程序员大牛给予Java初学者的学习路线建议 Java源码阅读的真实体会 概要 官方文档 Java™ Platform, Standard Edition 8 API Specific ...

  9. Numpy中rot90函数实现矩阵旋转

    从NumPy的官方完整查到rot90函数语法格式如下: rot90(m, k=1, axes=(0, 1) m是要旋转的数组(矩阵),k是旋转的次数,默认旋转1次,那是顺时针还是逆时针呢?正数表示逆时 ...

  10. 【PAT甲级】1047 Student List for Course (25 分)

    题意: 输入两个正整数N和K(N<=40000,K<=2500),接下来输入N行,每行包括一个学生的名字和所选课程的门数,接着输入每门所选课程的序号.输出每门课程有多少学生选择并按字典序输 ...