当前位置:  开发笔记 > 编程语言 > 正文

如何在Objective-C中打破两个嵌套的for循环?

如何解决《如何在Objective-C中打破两个嵌套的for循环?》经验,为你挑选了5个好方法。

我有两个这样嵌套的for循环:

for(...) {
    for(...) {

    }
}

我知道有一个break声明.但我很困惑,如果它打破了两个循环或只是它被调用的那个?一旦我发现重复迭代次数没有意义,我需要打破这两个.



1> Ori Pessach..:

如果使用goto简化代码,那么它是合适的.

for (;;) 
{
    for (;;) 
    {
        break; /* breaks inner loop */
    } 
    for (;;) 
    {
        goto outer; /* breaks outer loop */
    }
} 
outer:;


(;;)看起来像一张小脸.
为了扩展这个,`for(;;){for(;;){break;/*打破内部循环*/} for(;;){goto outer;/*打破外循环*/}}外部:;`

2> jbasko..:

break中断了一个循环,但你可以在外循环中添加一个检查,当内部中断时它会中断.

bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
   for ( ... ) {
      if (...) {
         dobreak = true;
         break;
      }
   }
}


恕我直言,使用goto更清洁.
`!dobreak`在错误的地方; 它应该进入条件(第二部分)而不是增量步骤(第三部分); 我也会使用`!dobreak && ..`,以便在破坏时不需要评估其他条件.我同意sigjuice:如果使用得当,`goto`并不邪恶,这就是`goto`*做*更好的代码的情况.
这仍然会在内循环之后执行外循环中可能的代码

3> unwind..:

break语句只能让你走出最里面的循环.如果您不希望在代码,内存和专用状态变量的性能方面增加额外开销,我建议将代码重构为自己的函数或方法,并使用return以摆脱所有循环:

void do_lots_of_work(void)
{
  int i, j;

  for(i=0; i<10 ; i++)
  {
    for(j=0;j< 10; j++)
    {
     ..
     ..
     if(disaster_struck())
      return; /* Gets us out of the loops, and the function too. */
    }
  }
}


更糟糕的是,在我看来,失去了通过在一个地方阅读算法来理解算法的能力.这一切都是为了避免转到?

4> lothar..:

除了已经提到的标志变量或goto之外,您可以抛出一个Objective-C异常:

@try {
  for() {
    for() {
       @throw ...
    }
  }
}
@catch{
  ...
}


哇,就像我要修改我的答案一样,指出人们会如何建议每一个复杂的解决方案,除了使用流量控制的例外只是为了避免转到...
@Ori Pessach Well Exceptions是goto的现代OO版本;-)
对ObjC中的异常做一些研究.在Apple文档中,他们特别认为性能受到了很大影响并且他们说,"Cocoa框架通常不是异常安全的.一般模式是异常只保留给程序员错误,并且程序捕获这样的异常应该很快就会退出".
根据我的经验,异常非常慢,不应该用于处理执行流程.

5> George Armho..:

其他人已经提到了如何设置标志或使用a goto,但我建议重构代码,以便将内部循环转换为单独的方法.然后该方法可以返回一些标志以指示外循环应该break.如果你恰当地命名你的方法,那就更具可读性了.

for (int i = 0; i < 10; i++) {
   if (timeToStop(i)) break;
}

-(bool) timeToStop: (int) i {
    for (int j = 0; j < 10; j++) {
        if (somethingBadHappens) return true;
    }

    return false;
}

伪代码,未经测试,但你明白了.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有