迭代列表并从objective-c中删除它的项目?

gri*_*yvp 2 objective-c

Objective-c有一个内置的列表迭代器,通过'for(a in b)语法,可以很好地与NSArray和其他集合一起使用.但是有没有可能在这样的迭代过程中删除项目而没有丑陋的技巧

for( int i = 0, i < [array count]; i ++ )
{
  if( condition )
  {
    [array removeItemAtIndex : i];
    i --;
  }
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*mir 14

您可以按相反顺序迭代数组,这样您就不需要额外调整索引:

for( int i = [array count]-1; i >=0; --i)
{
   if( condition )
   {
      [array removeItemAtIndex : i];
   }
}
Run Code Online (Sandbox Code Playgroud)

或者在枚举时累积要在indexset中删除的索引,然后一次删除所有元素:

NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];
for( int i = 0, i < [array count]; i ++ )
{
  if( condition )
  {
    [indexes addIndex : i];
  }
}
[array removeObjectsAtIndexes:indexes];
[indexes release];
Run Code Online (Sandbox Code Playgroud)

我会选择第二个选项,因为在枚举时更改数组可能不是一个好的样式(虽然在这种特殊情况下它不会给你错误)

  • 第二种方式可能(直观地)也更有效,因为你一次删除元素,加上Ole Bergeman说改变收集而枚举它通常不是一个好主意 - 如果你在"快速枚举"它时改变收集你会得到一个错误. (4认同)