我想用快速列舉時,得到當前對象的索引即跟蹤指數的快速列舉
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
我想用快速列舉時,得到當前對象的索引即跟蹤指數的快速列舉
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
看看在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
}];
我想最鈍的解決方案,這將是簡單地手動增加一個索引。
NSUInteger indexInSavedArray = 0;
for (MyClass *entry in savedArray) {
indexInSavedArray++;
}
或者,你可以只不使用快速枚舉。
for (NSUInteger indexInSavedArray = 0; indexInSavedArray < savedArray.count; indexInSavedArray++) {
[savedArray objectAtIndex:indexInSavedArray];
}
此外,他可以使用'[savedArray indexOfObject:進入]':) –
是的,那會工作,雖然這將是非常低效的,因爲它會發送到的isEqual每個對象領導到匹配對象。例如,如果獲得第500個元素的索引,然後再發送501個消息以獲得下一個對象,則需要500個isEqual消息發送(以及計算,如果對象實際上在isEqual中做了某些事情)。 編輯:也許你是諷刺,我錯過了一個笑話:) –
這個問題已經回答了,但我想我會補充說,計數迭代實際上是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++;
}
我確信會有一個奇特的技巧,但我猜不是。 :)
蘋果的方式是不安全的,恕我直言,以避免 - 當有人無意中添加一個「休息」或「繼續」到您的代碼時,它會出現可怕的錯誤。可悲的是,他們的快速枚舉設計並不是很好。 – Adam
如果在快速枚舉代碼中放置「break」或「continue」,是否意味着出現了問題?蘋果是否做了與C#不同的事情?只是要求我自己的教育(並避免未來的錯誤)。謝謝! – GrandAdmiral
簡單示例:示例代碼長度爲2行。如果長度爲20行,而在第5行,有人添加「繼續」?繼續將導致「元素」前進 - 但不是「索引」。啊哈!所以你把index ++放在開始位置,就在它被使用的地方之後。但是如果有人然後試圖在循環體中稍後引用它呢?現在它太大了1. ...等 – Adam
一個簡單的觀察:如果您將索引初始化爲-1,然後將++索引作爲for循環中的第一行,則不會涵蓋所有基數(只要某人不會滑入代碼增量的前面)?
「提供了某人不會在增量前面滑動代碼」最好的基於信念的編碼 – Tim
如果你想訪問索引或返回外部塊,這裏是一段可用的代碼。 (考慮數組是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;
}
添加 - 停止標誌通過調用'* stop = YES'使用(簡單地說'stop = YES'不起作用) – Tim
我想知道這是否更快,因爲只是添加索引整數 –