卸下对象我横跨以下快捷设立绊倒一个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