迭代器 ----- 设计模式

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)makeObjectsPerformSelector:(SEL)aSelector,它允许客户端向数组中每个元素发送一个消息,让每个元素执行指定的aSelector(假定元素支持它)。可以用前面提到的任何一种枚举方法让每个元素执行相同的选择器,达到相同的目的。这个方法在内部枚举集合并向每个元素发送performSelector:消息。这种方式的缺点是如果集合中任何元素不响应选择器,就会抛出异常。因此它主要适用于不需太多运行时检查的简单操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值