2011-11-13 32 views
27

我想用快速列舉時,得到當前對象的索引即跟蹤指數的快速列舉

for (MyClass *entry in savedArray) { 
// What is the index of |entry| in |savedArray|? 
} 

回答

62

看看在NSArray的API,你會看到該方法

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block 

所以給的是一個嘗試

[savedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

    //... Do your usual stuff here 

    obj // This is the current object 
    idx // This is the index of the current object 
    stop // Set this to true if you want to stop 

}]; 
+10

添加 - 停止標誌通過調用'* stop = YES'使用(簡單地說'stop = YES'不起作用) – Tim

+2

我想知道這是否更快,因爲只是添加索引整數 –

9

我想最鈍的解決方案,這將是簡單地手動增加一個索引。

NSUInteger indexInSavedArray = 0; 
for (MyClass *entry in savedArray) { 
    indexInSavedArray++; 
} 

或者,你可以只不使用快速枚舉。

for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) { 
     [savedArray objectAtIndex:indexInSavedArray]; 
    } 
+5

此外,他可以使用'[savedArray indexOfObject:進入]':) –

+6

是的,那會工作,雖然這將是非常低效的,因爲它會發送到的isEqual每個對象領導到匹配對象。例如,如果獲得第500個元素的索引,然後再發送501個消息以獲得下一個對象,則需要500個isEqual消息發送(以及計算,如果對象實際上在isEqual中做了某些事情)。 編輯:也許你是諷刺,我錯過了一個笑話:) –

7

這個問題已經回答了,但我想我會補充說,計數迭代實際上是iOS Developer Library文檔中提到的技術:

NSArray *array = <#Get an array#>; 
NSUInteger index = 0; 

for (id element in array) { 
    NSLog(@"Element at index %u is: %@", index, element); 
    index++; 
} 

我確信會有一個奇特的技巧,但我猜不是。 :)

+1

蘋果的方式是不安全的,恕我直言,以避免 - 當有人無意中添加一個「休息」或「繼續」到您的代碼時,它會出現可怕的錯誤。可悲的是,他們的快速枚舉設計並不是很好。 – Adam

+0

如果在快速枚舉代碼中放置「break」或「continue」,是否意味着出現了問題?蘋果是否做了與C#不同的事情?只是要求我自己的教育(並避免未來的錯誤)。謝謝! – GrandAdmiral

+3

簡單示例:示例代碼長度爲2行。如果長度爲20行,而在第5行,有人添加「繼續」?繼續將導致「元素」前進 - 但不是「索引」。啊哈!所以你把index ++放在開始位置,就在它被使用的地方之後。但是如果有人然後試圖在循環體中稍後引用它呢?現在它太大了1. ...等 – Adam

0

一個簡單的觀察:如果您將索引初始化爲-1,然後將++索引作爲for循環中的第一行,則不會涵蓋所有基數(只要某人不會滑入代碼增量的前面)?

+1

「提供了某人不會在增量前面滑動代碼」最好的基於信念的編碼 – Tim

3

如果你想訪問索引或返回外部塊,這裏是一段可用的代碼。 (考慮數組是NSString的數組)。

- (NSInteger) findElemenent:(NSString *)key inArray:(NSArray *)array 
{ 
    __block NSInteger index = -1; 
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     if ([obj isEqualToString:key]) { 
      *stop = YES; 
      index = idx; 
     } 
    }]; 
    return index; 
}