1前言
在面向对象中,针对抽象集合迭代行为的设计模式称为迭代器。
2 详述
2.1 简述
迭代器提供了一种顺序访问聚合对象(集合)中元素的方法,而无需暴露结构的底层表示和细节。便利集合中元素的只能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。不同的迭代器可以执行不同的遍历策略。
提供一种方法顺序访问一个聚合对象中得各个元素,而又不需暴露该对象的内部表示。
2.2 分类
外部迭代器:让客户端直接操作迭代过程,所以客户端需要知道外部迭代器才能使用。
内部迭代器:集合对象(被迭代的目标对象)在其内部维护并操作一个外部迭代器。提供内部迭代器的典型的集合对象为客户端定义一个接口,或者从底层的集合一次访问一个元素,或者向每个元素发送消息。
2.3 何时使用
(1)需要访问组合对象的内容,而又不暴露其内部表示;
(2)需要通过多种方式遍历组合对象;
(3)需要提供一个统一的接口,用来遍历各种类型的组合对象。
3 快速枚举
Objective-C2.0提供了一种枚举,称为快速枚举。它是苹果公司推荐的枚举方法。它允许把对集合对象的枚举直接用作for循环的一部分,无需使用其他枚举器对象,而且比传统的基于索引的for循环效率更高。快速枚举的语法如下:
NSArray * anArray = ... ;
for (NSString * item in anArray)
{
// 对item作些处理
}
现在枚举循环使用指针运算(pointer arithmetic),让它比使用NSEnumerator的标准方法效率更高。
要利用快速枚举,集合类需要实现NSFastEnumeration协议,以向运行库提供关于集合的必要信息。基础框架中的所有集合类与NSEnumerator类都支持快速枚举。因此不必使用while循环从NSEnumerator枚举每个元素,直到nextObject返回nil,我们可以使用其快速枚举的版本,如下面的代码段所示:
NSArray * anArray = ... ;
NSEnumerator * itemEnumerator = [anArray objectEnumerator];
for (NSString * item in itemEnumerator)
{
// 对item作些处理
}
虽然既可以使用集合对象的快速枚举,也可以使用枚举器的快速枚举,但如果只需要默认遍历(通常只按升序),直接对集合对象进行快速枚举更为合理。NSEnumerator使用其nextObject方法实现NSFastEnumeration协议。从性能上说,它比直接在while循环中手动调用这个方法好不了多少。尽管跟传统的使用nextObject的while循环相比,快速枚举中的for循环显得更为整洁。
4内部枚举
NSArray有个实例方法叫(void)makeObjectsPerformSelect