wake-up-neo.com

Wie kann ich aus zwei verschachtelten for-Schleifen in Objective-C ausbrechen?

Ich habe zwei so geschachtelte Schleifen:

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

    }
}

Ich weiß, dass es eine break-Anweisung gibt. Aber ich bin verwirrt darüber, ob es beide Schleifen bricht oder nur die, in der es heißt? Ich muss beide brechen, sobald ich sehe, dass es keinen Sinn macht, mehrmals zu iterieren.

73
Thanks

break bricht aus einer Schleife heraus, Sie können jedoch die äußere Schleife mit einem Häkchen versehen, die bei einem inneren Bruch bricht.

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

Wenn Sie mit goto den Code vereinfachen, ist es angebracht.

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

Die break-Anweisung bringt Sie nur aus der innersten Schleife heraus. Wenn Sie keinen zusätzlichen Aufwand für Code, Speicher und Leistung einer dedizierten Statusvariablen haben möchten, empfehle ich, den Code in eine eigene Funktion oder Methode umzuwandeln und return zu verwenden, um alle Schleifen zu verlassen:

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. */
    }
  }
}
13
unwind

Abgesehen von der bereits erwähnten Flagvariablen oder dem angegebenen goto können Sie throw eine Objective-C-Ausnahme annehmen:

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

Andere haben erwähnt, wie Sie ein Flag setzen oder eine goto verwenden können, aber ich würde empfehlen, Ihren Code so umzubauen, dass die innere Schleife in eine separate Methode umgewandelt wird. Diese Methode kann dann ein Flag zurückgeben, um anzuzeigen, dass die äußere Schleife break sein sollte. Wenn Sie Ihre Methoden entsprechend benennen, ist dies viel besser lesbar.

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;
}

Pseudocode, nicht getestet, aber Sie haben die Idee.

7
George Armhold

Ändern Sie den Zähler der oberen Schleife vor der Pause

for(i=0; i<10 ; i++)
  for(j=0;j< 10; j++){
     ..
     ..
     i = 10; 
     break;
  }
2
oxigen

Eine andere Lösung besteht darin, die zweite Schleife in einer Funktion herauszufiltern:

int i;

for(i=0; i<10 ; i++){
    if !innerLoop(i) {
        break;
    }
}

bool innerLoop(int i)
    int j;
    for(j=0;j< 10; j++){
        doSomthing(i,j);
        if(endcondtion){
            return false;
        }
    }
}
2
Martijn

Die break-Anweisung bricht nur den Geltungsbereich der Schleife aus, der die übergeordnete Schleife ist. Wenn Sie auch aus der zweiten Schleife ausbrechen möchten, können Sie eine boolesche Variable verwenden, die sich in beiden Schleifen befindet

bool isTerminated = false;

for (...)
{
    if (!isTerminated)
    {
        for(...)
        {
            ...

            isTerminated = true;
            break;
        }
    }
    else
    {
        break;
    }
}
2
Nick Allen

Am einfachsten ist es wahrscheinlich, eine "Flag" -Variable zu verwenden 

for(i=0; i<10 && (done==false); i++)
  for(j=0;j< 10; j++){
     ..
     ..
     if(...){done=true; break;}
  }
2
Yogi

Die break-Anweisung bricht aus der innersten Schleife aus. Eine zusätzliche Test- und Break-Anweisung wäre erforderlich, um die äußere Schleife zu verlassen.

1

Wenn eine Unterbrechung innerhalb einer Gruppe verschachtelter Schleifen ausgeführt wird, wird nur die innerste Schleife beendet, in der die Unterbrechung ausgeführt wird. (Wie bei Standard C)

0
Mitch Wheat

Nur für Grins, wie würden Sie diese wahr/falsch-Prüfung in eine Methode ändern und return-Anweisungen verwenden:

- (bool) checkTrueFalse: parameters{

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

         if (...) {
            return true;
         }

      }
   }
   return false;
}
0
Tom Howard

Genau wie die letzten sind im Allgemeinen so:

for(i=0;i<a;i++){  
 for(j=0;j<a;j++){
  if(Something_goes_wrong){
   i=a;
   break;
   }
 }
}
0
Martin