Objective-C的Foundation框架——枚举NSEnumerator

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);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33737036/article/details/81161297