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

 

發佈了67 篇原創文章 · 獲贊 28 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章