2009-06-21 17 views
31

Tengo un simple 'repetir con' en un AppleScript, y me gustaría pasar al siguiente elemento en la "repetición" condicionalmente. Básicamente, estoy buscando algo similar a "continuar" (¿o romper?) En otros idiomas.equivalente de Applescript de "continuar"?

No soy muy versado en AppleScript, pero lo he encontrado útil algunas veces.

Respuesta

42

Después de buscar este problema exacto, encontré este book extract en línea. Responde exactamente a la pregunta de cómo omitir la iteración actual y pasar directamente a la siguiente iteración de un ciclo repeat.

Applescript tiene exit repeat, que terminará por completo un bucle, omitiendo todas las iteraciones restantes. Esto puede ser útil en un ciclo infinito, pero no es lo que queremos en este caso.

parecer una característica continue -como no existe en AppleScript, pero aquí es un truco para simular que:

set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList -- # actual loop 
    repeat 1 times -- # fake loop 
     set value to item 1 of anItem 

     if value = "3" then exit repeat -- # simulated `continue` 

     display dialog value 
    end repeat 
end repeat 

Esto mostrará los cuadros de diálogo para 1, 2, 4 y 5.

Aquí, ha creado dos bucles: el bucle externo es su bucle real, el bucle interno es un bucle que se repite solo una vez. El exit repeat saldrá del bucle interno, continuando con el bucle externo: ¡exactamente lo que queremos!

Obviamente, si utiliza esto, perderá la capacidad de hacer un exit repeat normal.

+1

El código anterior no se compilará porque los comentarios en applescript son - no # – alexy13

+1

En applescript 2.0, el signo # también está permitido para comentarios: https://developer.apple.com/library/mac/documentation/applescript/ conceptual/applescriptlangguide/conceptual/ASLR_lexical_conventions.html # // apple_ref/doc/uid/TP40000983-CH214-SW8 – Joakim

+0

El código se compilaría de todos modos porque "-" precede a todo el "#" y "-" siempre ha marcado un comentar en AppleScript. –

6
set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList -- # actual loop 
    try 
     set value to item 1 of anItem 

     if value = "3" then error 0 -- # simulated `continue` 

     log value 
    end try 
end repeat 

Esto todavía le dará la "repetición de salida" possibillity

4
set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList -- # actual loop 
    try -- # needed to simulate continue 
     set value to item 1 of anItem 
     if value = "3" then continueRepeat -- # simulated `continue` throws an error to exit the try block 

     log value 
    on error e 
     if e does not contain "continueRepeat" then error e -- # Keeps error throwing intact 
    end try 
end repeat 

Basado en el enfoque basado en el bloque try anterior, pero lee un poco mejor. Por supuesto, como continueRepeat no está definido, se generará un error que hará que se salte el resto del bloque try.

Para mantener el lanzamiento de errores intactos, incluya la cláusula de error que arroja cualquier error inesperado.

2

- O usted podría utilizar diferentes estrategias: utilizar el bucle de bucle y hacer la lógica condicional en un controlador, así:

set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList 
    doConditionalWork(anItem as string) 
end repeat 

on doConditionalWork(value) 

    if value = "3" then return 

    display dialog value 

end doConditionalWork 
2

Ustedes están todos complicar la misma. Prueba esto:

set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList 
    set value to item 1 of anItem 
    if value is not "3" then log value 
end repeat 
1

También puede utilizar “repetir mientras que” para los bucles que sólo repetir de forma condicional.