在编程中经常需要列举collection中得元素,在当前的Objective-C语言中又多重办法实现此功能,可以用C语言循环,也可以用Objective-C 1.0中得NSEnumerator以及Objective-C 2.0的快速便利(fast enumeration)。在引入了“block”之后,又多出来了集中的的遍历方式。下面详细说明。
for循环
NSArray *anArray = /*...*/;
for (int i = 0; i < anArray.count; i++)
{
id object = anArray[i];
//Do something with 'object'
}
这么写还好,不过如果要便利字典或者set,就要复杂一点了:
//Dictionary
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中得值。创建这个附加数组会有额外的开销,而且还会多创建一个数组对象,它会保留collection中得所有元素对象。当然了,释放数组时这些附加对象也要释放,可以要调用本来不需要执行的方法。其它各种便利方式都无需创建这种中介数组。
for循环也可以实现反向遍历,计数器的值从“元素个数减1”,每次迭代时递减直到0为止。执行反向遍历时,使用for循环会比其它方式简单许多。
用Objective-C 1.0中的 NSEnumerator 来遍历NSEnumerator 是个抽象基类,其中只定义了两个方法,供其具体子类来实现:
for循环也可以实现反向遍历,计数器的值从“元素个数减1”,每次迭代时递减直到0为止。执行反向遍历时,使用for循环会比其它方式简单许多。
用Objective-C 1.0中的 NSEnumerator 来遍历NSEnumerator 是个抽象基类,其中只定义了两个方法,供其具体子类来实现:
-(NSAraay *)allObjects;
- (id)nextObject;
其中关键的方法是nextObject,它返回枚举对象里的下个对象。每次调用该方法时,其内部的数据结构都会更新,使得下次调用方法时能返回下一个对象。等到枚举中得全部对象都已返回之后,再调用就将返回nil,这表示达到枚举末端了。
Foundation框架中内建的collection类都实现了这种遍历方式。例如,想遍历数组,可以这样写代码:
Foundation框架中内建的collection类都实现了这种遍历方式。例如,想遍历数组,可以这样写代码:
NSArray *anArray = /* ... */;
NSEnumerator *enumerator = [anArray objectEnumerator];
id object;
while ((object = [enumerator nextObject]) !