2010-07-14 6 views
33

Comment puis-je utiliser une instruction 'break' dans une boucle for qui continue à former une étiquette spécifiée?Objectif C break-loop et continuer

ex;

outer: for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int i = 0;i<[arABFBmatches count];i++){ 
     // 
     break _____; 
    } 
} 

Comment casser vers l'extérieur?

Répondre

94

Difficile à dire de votre question. Je l'interpréterais comme si vous vouliez passer le reste des itérations de la boucle interne et continuer la boucle externe?

for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) 
      break; // let outer loop continue iterating 
    } 
} 

Notez que j'ai changé le nom de votre invariant de boucle interne; en utilisant i dans les deux est invitant la folie.

Si vous voulez rompre avec les deux boucles, je n'utiliserais pas de goto. Je ferais:

BOOL allDoneNow = NO; 
for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) { 
      allDoneNow = YES; 
      break; 
     } 
    } 
    if (allDoneNow) break; 
} 
+32

+1 pour invoquer la folie. – uchuugaka

+9

Et s'il vous plaît, par souci de lisibilité, n'oublions pas de mettre des espaces autour de nos opérateurs. Pas "pour (int i = 0; i <[arABFBmatches count]; i ++)".Au lieu de cela: "pour (int i = 0; i <[arABFBmatches compte]; i ++)" –

+0

Vous monsieur est génie. – GeneCode

9

En gros:

for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int j = 0;j<[arABFBmatches count];j++){ 
     // 
     goto outer_done; 
    } 
} 
outer_done: 

Objective-C n'a pas marqué la rupture.

+1

Si vous allez utiliser 'goto', soyez très très attentif à gérer correctement la gestion de la mémoire. –

+0

'goto' est mieux que de mettre un drapeau et de tester le drapeau pour savoir s'il faut sortir de la boucle externe. Bien sûr, nous devons faire attention. – neevek

+4

Pas nécessairement mieux du tout; Si la boucle interne est entourée d'une logique de configuration/démontage, le 'goto' peut heureusement sauter directement au-dessus du démontage. Si vous devez ajouter ce type de logique plus tard, il est facile d'oublier le cas de court-circuit lors de la refactorisation. Il y a un argument fort à faire pour le contrôle-flux qui est sans saut. – bbum

1

'break' ne vous sortira que de la boucle ou du switch le plus à l'intérieur. Vous pouvez utiliser 'return' pour quitter une fonction à tout moment. Veuillez regarder le lien this.

+0

La plupart des règles de conception commerciale exigent seulement un (1) «retour» d'une fonction. – Vincent

1
BOOL done = NO; 
for(int i = 0;i<[arABFBmatches count] && !done; i++) 
{ 
    for(int i = 0;i<[arABFBmatches count] && !done;i++) 
    { 
     if (termination condition) 
     { 
      // cleanup 
      done = YES; 
     } 
    } 
} 
+1

Pouvez-vous également ajouter une explication? – Robert

2

De Objective-C docs Apple:

Objective-C est défini comme un petit mais puissant ensemble d'extensions la langue standard ANSI C.

, PORTER et continuer peuvent être utilisés partout où ils sont autorisés dans C.

continuent peuvent être utilisés dans les constructions en boucle (pour, tandis que et boucles do/while).

break peut être utilisé dans ces mêmes constructions en boucle ainsi que dans les instructions de commutation.

2

bas vote ...... Si l'utilisation de goto simplifie le code, alors ce serait approprié.

for (;;) 
{ 
    for (;;) 
    { 

     break; /* breaks inner loop */ 

    } 

    for (;;) 
    { 

     goto outer; /* breaks outer loop */ 
    } 

} 
outer:; 
+1

Cette réponse semble être plagiatée de [cette publication] (http://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c/863392 # 863392). – Pang

+0

Non, désolé, cette réponse est la mienne. –