0x01 枚举
NSArray经常要对数组中的每一个元素执行同一个操作,我们可以选择编写一个从0到[array count]的循环来读取每个索引处的对象,也可以使用NSEnumerator,Cocoa可以用它来表示集合中迭代出的对象。
objectEnumerator
要想使用NSEnumerator,需要通过objectEnumerator向数组请求枚举器:
- (NSEnumerator *)objectEnumerator;
//示例
NSEnumerator *enumerator = [array objectEnumerator];
reverseObjectEnumerator
如果需要从后往前浏览某个集合,可以使用reverseObjectEnumerator方法。
nextObject
在获得枚举器后,便可以开始一个while循环。
每次循环都向这个枚举器请求它的nextObject,即下一个对象。
当nextObject返回nil值时,循环结束(这也是不能在数组中存储nil值得原因之一)!!
- (id) nextObject;
// NSEnumerator示例
NSArray *array= [NSArray arrayWithObjects:@"123",@"456",@"789",nil];
NSEnumerator *enumerator = [array reverseObjectEnumerator];
id thingie;
while (thingie = [enumerator nextObject])
{
NSLog(@"Ifound %@",thingie);
}
对可变数组进行枚举操作时,有一点需要注意:
不能通过添加或删除对象这类方式来改变数组的容量,否则枚举器将会混乱,通过枚举器得到的将是未定义结果!
0x02 快速枚举
在Mac OS X 10.5中,苹果公司将Objective-C语言的版本升级到2.0 。从此有了快速枚举:
for (NSString *string in array)
{
NSLog (@"I found %@", string);
}
这个for循环将遍历数组中的每一个元素,并且用变量string来存储每个数组值,语法显得简单明了。
但快速枚举不能用在版本低于10.5的Mac系统中。
0x03 遍历数组的三种方法
通过索引
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSArray *array = @[@"123", @"234", @"345"];
for (NSUInteger i = 0; i < [array count]; i++)
NSLog (@"The output is %@.", [array objectAtIndex:i]);
return 0;
}
通过NSEnumerator
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSArray *array = @[@"123", @"234", @"345"];
NSEnumerator *enumerator = [array objectEnumerator];
id thingie = nil;
while (thingie = [enumerator nextObject])
{
NSLog (@"I found %@", thingie);
}
}
通过快速枚举
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSArray *array = @[@"123", @"234", @"345"];
for (NSString *string in array)
{
NSLog (@"I found %@", string);
}
}