前言
注:本文摘自《编写高质量iOS与OS X代码的52个有效方法》第7章第48条并进行了相关整理和扩充
我们在编程中,经常性的需要列举
collection
中的元素,在OC中,有多种形式来实现该功能:
- C语言中的for循环
- Objective-C 1.0 的
NSEnumerator
- Objective-C 2.0 的快速遍历
- 基于块的遍历方式
开发中,我们常常使用第一种和第三种遍历方式,而往往忽略其他几种遍历方式,但实际上,某些情况下使用其他的方法会大幅度简化编码的过程。
注:本文中所讲的
collection
,包含NSArray
,NSDictionary
,NSSet
这几个频繁使用的类型。
C语言中的for循环
遍历数组我们最常采用的方法就是采用for循环:
遍历数组
NSArray *anArray = /*...*/;
for (int i = 0 ; i < anArray.count; i ++){
id object = anArray[i];
//Do something with 'object'
}
遍历字典
NSDictionary *aDictionary = /*...*/;
NSArray *keys = [aDictionary allKeys];
for(int i = 0; i < keys.count; i ++){
id key = keys[i];
id value = aDictionary[key];
//Do something with 'key' and 'value'
}
遍历set
NSSet *aSet = /*...*/;
NSArray *objects = [aSet allObjects];
for(int i = 0; i < objects.count; i ++){
id object = objects[i];
//Do something with 'object'
}
可以看到,遍历数组的过程还比较简便。但是字典和set相对来说比较复杂。由于字典与set都是无序的,无法根据特定的整数下标来直接访问其中的值,必须先获取字典里的所有的键或是set里的全部对象,为了保存字典里所有的键或是set中的全部对象,我们必须要创建额外的一个数组对象,用于保留collection
中的这些元素对象。相对的,释放操作时,也要将这些额外的对象释放掉,执行了本来不需要执行的方法。相比较而言,其他的方法则无需创建这种中介数组。
反向遍历
当然for循环也可以实现反向遍历,只需要将计数器i
的值从元素个数递减。就反向遍历而言,相比较其他的方法简便许多。
NSArray *anArray = /*...*/;
for (int i = anArray.count ; i >= 0; i --){
id object = anArray[i];
//Do something with 'object'
}
使用NSEnumerator进行遍历
NSEnumerator
是一个抽象的基类,定义中只提供了一个公共方法和一个公共属性供子类来实现。
@property (