在Mac OX1 0.5中,为了将Objective-C升级到2.0版本,苹果公司对其进行了一系列的小调整,快速枚举就是其中之一,他的语法与脚本语言类似。如下面的代码所示:
for(NSString *string in array){
NSLog(@"I found %@",string);
}
这个循环体将会遍历数组中的每个元素,并且用变量string存储每个数组值。
下面通过一段程序来解释:
遍历寻找磁盘上的jpg文件:
---------第一节
#import <Foundation/Foundation.h>
int main (int argc, constchar * argv[]) {
//创建一个自动释放池
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSFileManager *manager; //创建一个文件管理器
manager = [NSFileManager defaultManager];
NSString *home; //指定目录,stringByExpandingTildeInPath方法可以接受 ~ 字符并将其展开
home = [@"~" stringByExpandingTildeInPath];
//创建一个字典迭代器,并将路径字符串传给文件管理器
NSDirectoryEnumerator *direnum;
direnum = [manager enumeratorAtPath: home];
NSMutableArray *files; //创建一个可变数组,并将匹配的路径添加进去
files = [NSMutableArray arrayWithCapacity: 42];
NSString *filename;
while (filename = [direnum nextObject]) {
if ([[filename pathExtension]
isEqualTo: @"jpg"]) {
[files addObject: filename];
}
}
//创建一个枚举器,并把files可变数组对象加入,这样可以使用nextObject 方法。目录循环结束后,遍历文件数组,用NSLog()将数组内容输出
NSEnumerator *filename;
fileenum = [files objectEnumerator];
while (filename = [fileenum nextObject]) {
NSLog (@"%@", filename);
}
[pool drain];
return0;
}
------第二节
#import <Foundation/Foundation.h>
int main (int argc, constchar * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSFileManager *manager;
manager = [NSFileManager defaultManager];
NSString *home;
home = [@"~" stringByExpandingTildeInPath];
NSMutableArray *files;
files = [NSMutableArray arrayWithCapacity: 42];
//这里使用了快速枚举
for (NSString *filename in [manager enumeratorAtPath: home]) {
if ([[filename pathExtension]
isEqualTo: @"jpg"]) {
[files addObject: filename];
}
}
for (NSString *filename in files) {
NSLog (@"%@", filename);
}
[pool drain];
return0;
}
好吧!把不同的拿出来:
NSDirectoryEnumerator *direnum; direnum = [manager enumeratorAtPath: home];
NSString *filename;
while (filename = [direnum nextObject]) { if ([[filename pathExtension] isEqualTo: @"jpg"]) { [files addObject: filename]; } }
NSEnumerator *filename; fileenum = [files objectEnumerator];
while (filename = [fileenum nextObject]) { NSLog (@"%@", filename); } |
for (NSString *filename in [manager enumeratorAtPath: home]){ if ([[filename pathExtension] isEqualTo: @"jpg"]) { [files addObject: filename]; } }
for (NSString *filename in files) { NSLog (@"%@", filename); }
分析,左边采用枚举,使用nextObject实例,寻找下个图片路径 这边使用了快速枚举,可以以最快速度遍历 |
比较两段程序,他们实现的功能是一样的,主要的区别是在后面一段,第二个程序使用了快速枚举。
--------------------------------
内容来源与Learn Objective-C on the Mac
---------------------------------