Comment puis-je briser deux boucles nestedes dans Objective-C?

J’ai deux pour les boucles nestedes comme ceci:

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

Je sais qu’il y a une déclaration de break . Mais je ne sais pas si cela brise les deux boucles ou juste celle dans laquelle il a été appelé? Je dois rompre les deux dès que je vois que cela n’a pas de sens d’itérer plus de fois.

break break of a loop, mais vous pouvez append une vérification à la boucle externe qui se brise lorsque la boucle se brise.

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

Si utiliser goto simplifie le code, alors ce serait approprié.

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

L’instruction break ne vous permet de sortir de la boucle la plus profonde. Si vous ne voulez pas append la surcharge dans le code, la mémoire et les performances d’une variable d’état dédiée, je recommande de refactoriser le code dans une fonction ou une méthode et d’utiliser return pour sortir de toutes les boucles:

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

En dehors de la variable d’indicateur déjà mentionnée ou de goto, vous pouvez lancer une exception Objective-C:

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

D’autres ont mentionné comment vous pouvez définir un drapeau ou utiliser un goto , mais je vous recommande de refactoriser votre code pour que la boucle interne soit transformée en une méthode distincte. Cette méthode peut alors renvoyer un drapeau pour indiquer que la boucle externe doit se break . Si vous nommez vos méthodes de manière appropriée, cela est beaucoup plus lisible.

 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, non testé, mais vous avez l’idée.

L’instruction break ne sortira que de la boucle, qui est la boucle parente. Si vous souhaitez également sortir de la seconde boucle, vous pouvez utiliser une variable booléenne qui est dans la scope des deux boucles

 bool isTerminated = false; for (...) { if (!isTerminated) { for(...) { ... isTerminated = true; break; } } else { break; } } 

Changer le compteur de la boucle supérieure avant la pause

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

Le moyen le plus simple est probablement d’utiliser une variable “flag”

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

Une autre solution consiste à factoriser la seconde boucle dans une fonction:

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

Si une rupture est exécutée à partir d’un ensemble de boucles nestedes, seule la boucle la plus interne dans laquelle la rupture est exécutée est terminée. (Juste comme la norme C)

La déclaration de rupture sort de la boucle la plus profonde. Un test et une instruction de rupture supplémentaires seraient nécessaires pour sortir de la boucle externe.

Exactement comme les derniers sont, généralement comme ceci:

 for(i=0;i 

Juste pour les sourires, que diriez-vous de changer cette vérification true / false en une méthode et en utilisant des instructions de return :

 - (bool) checkTrueFalse: parameters{ for ( ...) { for ( ... ) { if (...) { return true; } } } return false; }