我偶然发现了以下设置for循环的快捷方式(与我一直使用的教科书示例相比,快捷方式):
for (Item *i in items){ ... }
与较长的格式相反:
for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right
如果我使用较短的版本,有没有办法删除当前正在迭代的项目(即'i')?或者我需要使用更长的格式吗?
答案 0 :(得分:31)
fast-enumerating时,您无法从阵列中删除对象:
计算是“安全的” - 枚举者 有一个变异防守,所以如果你 尝试修改集合 在枚举期间,例外情况是 提高。
无论如何,为什么你需要在枚举时更换容器?考虑存储需要删除的元素,并使用removeObjectsInArray:
或removeObjectsAtIndexes:
方法将其从容器中删除。
答案 1 :(得分:9)
删除项目后,只需添加关键字break;
for(id item in items) {
if([item isEqual:itemToDelete]) {
[items removeObject:item];
break;
}
}
答案 2 :(得分:3)
在枚举期间不得修改Objective-C集合。
您可以使用此变体从集合中删除对象:
for (NSInteger i = items.count - 1; i >= 0 ; i--) {
[items removeObjectAtIndex:i];
}
答案 3 :(得分:1)
前一个循环是Objective C中的“for-each”循环。
* i是指向items-Array中直接项的指针(大部分时间都是NSMutableArray)。
这样您就可以直接在项目上操作:
[items removeObject: i];
这(应该)工作 - 我目前没有在我的Mac上工作,无法检查它。 但是,Objective-C可能会在迭代集合时阻止删除对象(在大多数语言中都很常见)。
答案 4 :(得分:0)
我使用此代码:
for (NSUInteger i = [items count] - 1; ; i--) {
[items removeObjectAtIndex:i];
}