我在设置for循环时偶然发现了以下快捷方式(相对于我一直在使用的教科书示例而言):
for (Item *i in items){ ... }
相对于更长的格式:
for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right
如果我使用更短的版本,是否有一种方法可以删除当前正在迭代的项(即“i”)?还是我需要使用较长的格式?我在设置for循环时偶然发现了以下快捷方式(相对于我一直在使用的教科书示例而言):
for (Item *i in items){ ... }
相对于更长的格式:
for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right
如果我使用更短的版本,是否有一种方法可以删除当前正在迭代的项(即“i”)?还是我需要使用较长的格式?在快速枚举数组时不能删除其中的对象:
枚举是“安全”的—枚举器有一个突变保护,以便在枚举期间尝试修改集合时会引发异常。
无论如何,在枚举容器时为什么要改变它呢?考虑存储需要删除的元素,并使用removeObjectsInArray:
或removeObjectsAtIndexes:
方法从容器中删除它们。
[destinationArray addObjectsFromArray: sourceArray]; [sourceArray removeAllObjects];
- JeremyP在删除项目后,只需添加关键字break;
即可...
for(id item in items) {
if([item isEqual:itemToDelete]) {
[items removeObject:item];
break; // A very important line
}
}
在枚举期间,Objective-C集合不得被修改。
您可以使用以下变体从集合中删除对象:
for (NSInteger i = items.count - 1; i >= 0 ; i--) {
[items removeObjectAtIndex:i];
}
前面的循环是Objective C中的“for-each”循环。
*i是指向items-Array中直接项的指针(大多数情况下这将是NSMutableArray)。
这样你就可以直接操作该项:
[items removeObject: i];
这个(应该)可以工作 - 我目前没有在我的 Mac 上工作,无法检查它。 然而,可能是 Objective-C 防止在迭代集合时删除对象(这在大多数语言中都很常见)。
NSMutableArray
时无法删除(或突变)它,因此 removeObject:
调用会引发异常。(正如弗拉基米尔在他的答案中所解释的那样) - Nick Forge我使用这段代码来实现这个功能:
for (NSUInteger i = [items count] - 1; ; i--) {
[items removeObjectAtIndex:i];
}
removeObjectsInArray:
或removeObjectsAtIndexes:
来删除它们,那么你总是可以遍历原始数组的副本。 - Tiago