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