我希望摆脱被枚举的循环。
以下是我的问题的一个例子:
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
循环?
答案 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];