2011-05-14 91 views
5

比方說,我有三個相同大小的數組。我必須對所有物體做些什麼。如果我會用一個標準的C數組,我就喜歡寫東西多個NSArray枚舉

for (i = 0; i < size; i++) { 
    doSomething(array1[i]); // or [[array1 objectAtIndex:i] doSomething]; 
    doSomethingElse(array2[i]); // or [[array2 objectAtIndex:i] doSomethingElse]; 
    doSomethingReallySpecial(array3[i]); // or [[array3 objectAtIndex:i] doSomethingReallySpecial]; 
} 

有了目標C通過我們中的對象NSArray中得到了更多的方式來循環:快速列舉,基於塊的枚舉和使用枚舉。我應該使用哪一個,爲什麼?有什麼不同?

編輯
其實這個問題可以配製這樣的:如果用戶需要使用一個數組,一個項目的索引應該使用哪個枚舉?

回答

0

你應該使用最清楚地向代碼讀者表達你的代碼意圖的那個。除非你已經確定這個循環是一個重要的性能瓶頸,否則維護你的代碼的能力就顯得尤爲重要。 (即for(id i in array))不提供索引。如果您不想使用C風格的循環,則-[NSArray enumerateObjectsUsingBlock:]會同時提供當前項目和索引,並可用於壓縮多個陣列。我懷疑,對於多個陣列來說,C風格的方法在性能上往往會有效等價 - 並且對讀者而言可能更清晰,但您應該將其描述爲確定。

你在尋找什麼是函數式編程中的一個常見習慣用法,當然可以在使用塊的GCD之上實現,但是我不知道任何實現。

4

基於NSEnumerator的方法曾經是枚舉的唯一支持方式。我想不出它對其他方面有什麼優勢 - 它更慢,更笨重,並且在很大程度上被其他方法所取代。

使用塊允許很大的靈活性。一種方法可以接受一個塊作爲參數,並使用該枚舉在幾個不同的類別:

- (void) doSomethingToFruits:(void(^)(id,NSUInteger,BOOL*))block 
{ 
    [apples enumerateObjectsUsingBlock:block]; 
    [bananas enumerateObjectsUsingBlock:block]; 
    [kiwis enumerateObjectsUsingBlock:block]; 
} 

您也可以使用選項參數在enumerateObjectsUsingBlock:options:併發枚舉內容,。

東西我喜歡快速列舉的是,NSFastEnumeration協議允許我補充一點,可以接受的陣列或集合,(或哈希表或其他),但一個方法仍具有靜態類型的參數檢查:

- (void) addObjectsFromCollection:(id<NSFastEnumeration>)coll 
{ 
    for (id obj in coll) [self addObject:obj]; 
} 

否則,兩者的語法在不同的上下文中似乎更合適。我發現如果一個方法的主體枚舉了一個集合,那麼如果我使用快速枚舉就會更清楚,而如果我只想在更大的方法中對所有內容執行一個或兩個動作,則塊更簡潔,但我想這部分是根據個人喜好。

附錄:

如果你想跟蹤的指數,該塊選項接受一個索引作爲參數。

+0

感謝您的徹底解答! – adubr 2011-05-14 21:11:44