卸下對象我橫跨以下快捷設立絆倒一個for循環(快捷相比我已經使用教科書的例子):從的NSMutableArray
for (Item *i in items){ ... }
與之相對較長的格式:
for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right
如果我使用較短的版本,有沒有辦法刪除當前正在迭代的項目(即'我')?或者我需要使用更長的格式?
卸下對象我橫跨以下快捷設立絆倒一個for循環(快捷相比我已經使用教科書的例子):從的NSMutableArray
for (Item *i in items){ ... }
與之相對較長的格式:
for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right
如果我使用較短的版本,有沒有辦法刪除當前正在迭代的項目(即'我')?或者我需要使用更長的格式?
而fast-enumerating它不能從陣列中刪除對象:
記數是「安全的」誠枚舉 具有突變後衛,這樣,如果你 試圖枚舉過程中修改集合 ,一個例外是提出了 。
無論如何,你爲什麼需要在枚舉時更改容器?考慮存儲需要刪除的元素,並使用removeObjectsInArray:
或removeObjectsAtIndexes:
方法將其從容器中刪除。
謝謝。枚舉時我正在改變它,因爲它是一個臨時隊列。我將所有項目移動到另一個陣列。 – 2010-05-03 18:27:52
如果將所有對象移動到另一個數組,請嘗試以下操作:[destinationArray addObjectsFromArray:sourceArray]; [sourceArray removeAllObjects];' – JeremyP 2010-05-04 08:29:10
是的,我發現 - 謝謝。 – 2010-05-06 04:25:13
前者環是「的for-each」在目的C.
循環* i是一個指針,指向直接項目中的項-陣列(大多數時間,這將是NSMutableArray裏)。
這樣你就可以直接對項目進行操作:
[items removeObject: i];
這(應該)的工作 - 我目前沒有工作在我的Mac,不能檢查。 但是,它可能是Objective-C在迭代集合時阻止移除對象(這在大多數語言中很常見)。
確實如此,枚舉時不能移除(或變異)一個'NSMutableArray',所以'removeObject:'調用會引發一個異常。 (弗拉基米爾在他的回答中解釋) – 2010-05-03 10:07:34
Objective-C的集合不能枚舉過程中被修改。
你可以使用這個變體從集合刪除對象:
for (NSInteger i = items.count - 1; i >= 0 ; i--) {
[items removeObjectAtIndex:i];
}
Imho是正確執行此操作的最短途徑,因爲您的業務邏輯可以很好地從後向前遍歷數組。 – marsbear 2016-08-18 15:37:23
第一個for循環被稱爲增強的for循環,而第二一個是舊的FOR循環標準。我在做Java認證時學到了這一點。 – Popeye 2012-08-10 21:58:39
如果您確實需要在迭代它時刪除數組中的項目,並且您不能使用removeObjectsInArray:或removeObjectsAtIndexes:像@Vladimir建議的那樣將它們刪除,那麼您總是可以迭代原始數組的副本。 – Tiago 2014-08-04 16:14:26