突破被枚举的循环

时间:2014-12-14 00:38:24

标签: objective-c for-loop

我希望摆脱被枚举的循环。

以下是我的问题的一个例子:

for(NSArray *x in retrieved_data){

  for(NSDictionary *someJson in array_that_is_enumerated){

     if(intersection_of_retrieved_data_indicates_deletion_in_array){
         [array_that_is_being_enumerated removeObject:someJson];

         // can't call return; here: it's important outer for loop finishes.
         // break; will only have effect in this scope

     } else {// perform other logic}
  }

}

如何删除此对象并再次跳转到第一个for/in循环?

2 个答案:

答案 0 :(得分:2)

break终止最近的封闭循环,因此break中的if移动到外循环的下一次迭代,来自:

  

不能打电话回来;这里:它是重要的外圈完成循环

似乎正是您想要的。

终止多个嵌套循环可能很麻烦,您可以执行以下操作:使用标签和goto;设置一个标志来测试每个循环;或者将循环包装在函数/方法/块和return中。

HTH

<强>附录

关于在枚举时删除的评论/答案似乎有些担忧,而这完全正确你可以在枚举循环中删除,只要你终止循环 - 它正在进行到下一个迭代是不允许的。那么OP正在做什么,一个测试删除中断,完全可以。

评论后

继续附录之后,这里有一些示例代码:

NSArray *outer = @[@"one", @"three", @"dog"];

NSMutableArray *inner = @[@"one", @"two", @"cat", @"dog"].mutableCopy;

NSLog(@"Before: %@", inner);
for (NSString *wordToDelete in outer)
{
   NSLog(@"Consider: %@", wordToDelete);
   for (NSString *item in inner)
   {
      if ([item isEqualToString:wordToDelete])
      {
         NSLog(@"Removing and breaking");
         [inner removeObject:item];
         break;
      }
   }
   // break lands here
}
NSLog(@"After: %@", inner);

最终结果是@[ @"two", @"cat" ]。内循环终止,外循环完成。这样做是合理的,在 inner被修改之后进行迭代是不正确的。

答案 1 :(得分:0)

我认为你可以在没有break的情况下得到你想要的东西。似乎内部循环的工作是识别应该删除的array_that_is_enumerated中的元素,并且该决定取决于retrieve_data中的元素。

@Agressor是对的,你在枚举时不能删除,那么如何在函数中隔离删除条件呢?

// this could be done neatly as an NSPredicate, too
- (NSDictionary *)itemInInnerArrayThatShouldBeDeleted:(NSArray *)xFromRetrievedData {
    for (NSDictionary *someJson in array_that_is_enumerated) {
        if (intersection_of_retrieved_data_indicates_deletion_in_array) {
            return someJson;
        }
    }
    return nil;
}

现在你的外部循环收集要删除的元素,如下所示:

NSMutableArray *deleteThese = [NSMutableArray array];

for (NSArray *x in retrieved_data) {
    NSDictionary *someJson = [self itemInInnerArrayThatShouldBeDeleted:x];
    if (someJson) [deleteThese addObject:someJson];
}
// now that we are done enumerating, we can safely delete
[array_that_is_enumerated removeObjectsInArray:deleteThese];