2012-02-23 11 views
12

Si tengo un bucle while con un bucle for dentro del bucle while, ¿cómo puedo break ambos bucles?ios rompen anidado bucle

Estoy haciendo esto porque los 250ms extra que obtengo de no completar estos bucles después de encontrar lo que quiero se acumulan para ser valiosos después de un tiempo.

pseudocódigo:

while(alwaysTrue) { 
    for(NSArray *arr in twoThousandItems) { 
     if(IFoundWhatIWasLookingFor) { 
      // assign some stuff here 
      // break everything, not just the for loop. 
     } 
    } 
} 
+3

todas las sugerencias hasta ahora, parecen precisas. elegir cualquiera de ellos no estaría mal. el diseño que sugeriría es hacer que la pieza que desea romper se salga de su propia función/método y regrese de ella. La abstracción es el poder principal de la programación funcional y orientada a objetos: úsala. – bshirley

+0

Reetiquetado porque es una pregunta de idioma, no una pregunta de sistema operativo. :) – Almo

+0

@bshirley He usado 'goto' aunque estoy un poco receloso al respecto. Está solo en un lugar en toda la aplicación, así que creo que está bien. Sin embargo, debido a algunos cambios en el diseño del código, pudimos cambiar a un método de su sugerencia (que siempre es mi primera opción). +1 – Jacksonkr

Respuesta

28

Aquí es donde goto es su amigo. Sí, eso goto.

while(alwaysTrue) { 
    for(NSArray *arr in twoThousandItems) { 
     if(IFoundWhatIWasLookingFor) { 
      // assign some stuff here 
      // break everything, not just the for loop. 
      goto BAIL; 
     } 
    } 
} 
BAIL: 
NSLog(@"Freedom!"); 

La otra opción es tener cortocircuitos en sus bucles.

while(alwaysTrue && !found) { 
    for(NSArray *arr in twoThousandItems) { 
     if(IFoundWhatIWasLookingFor) { 
      // assign some stuff here 
      // break everything, not just the for loop. 
      found = YES; 
      break; 
     } 
    } 
} 
+15

No es amigo de nadie, 'goto' es malo. +1 – picciano

+4

Después de leer sobre 'goto' parece que el ** uso excesivo ** de eso es lo que es malo. Si bien soy más partidario de utilizar las funciones de devolución mencionadas por * @ bshirley *, un 'goto' funcionará para esta ** ** ** situación. Gracias y +1 – Jacksonkr

4

Esta es de una manera. Esta es una técnica aplicable para otras variantes C y otros lenguajes también.

bool breakOuterLoop = false; 
while(!breakOuterLoop) 
{ 
    for(NSArray *arr in twoThousandItems) 
    { 
     if(IFoundWhatIWasLookingFor) 
     { 
      // assign some stuff here 
      breakOuterLoop = true; 
      break; 
     } 
    } 
} 
Cuestiones relacionadas