2009-06-21 10 views
31

J'ai une simple "répétition avec" dans un AppleScript, et je voudrais passer à l'élément suivant dans la "répétition" conditionnellement. Fondamentalement, je cherche quelque chose de similaire à "continuer" (ou casser?) Dans d'autres langues.L'équivalent apellé de "continuer"?

Je ne connais pas très bien AppleScript mais je l'ai trouvé utile à quelques reprises maintenant.

Répondre

42

Après la recherche de ce problème exact, je trouve cette book extract en ligne. Il répond exactement à la question de savoir comment ignorer l'itération en cours et passer directement à l'itération suivante d'une boucle repeat.

Applescript a exit repeat, qui se terminera complètement une boucle, en sautant toutes les itérations restantes. Cela peut être utile dans une boucle infinie, mais ce n'est pas ce que nous voulons dans ce cas.

Apparemment continue -comme fonctionnalité n'existe pas dans AppleScript, mais voici une astuce pour simuler:

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 

Cela permet d'afficher les boîtes de dialogue pour 1, 2, 4 et 5.

Ici, vous avez créé deux boucles: la boucle externe est votre boucle réelle, la boucle interne est une boucle qui se répète une seule fois. Le exit repeat quittera la boucle interne, en continuant avec la boucle externe: exactement ce que nous voulons!

De toute évidence, si vous l'utilisez, vous perdrez la possibilité de faire une exit repeat normale.

+1

Le code ci-dessus ne compilera pas car les commentaires dans l'applescript sont - pas # – alexy13

+1

Dans l'applescript 2.0, le signe # est également autorisé pour les commentaires: https://developer.apple.com/library/mac/documentation/applescript/ conceptuel/applescriptlangguide/conceptuel/ASLR_lexical_conventions.html # // apple_ref/doc/uid/TP40000983-CH214-SW8 – Joakim

+0

le code compilerait de toute façon parce que « - » précède tous les « # » et « - » a toujours marqué un commenter dans 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 

Cela vous donnera encore la « répétition de sortie » de possibillité

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 

Sur la base de l'approche basée sur le bloc d'essai ci-dessus mais lit un peu mieux. Bien sûr, puisque continueRepeat n'est pas défini, une erreur sera générée et le reste du bloc try sera ignoré. Pour éviter que le lancement d'erreur soit intact, incluez la clause on error qui déclenche toute erreur inattendue.

2

- Ou vous pouvez utiliser une stratégie différente: utiliser la boucle en boucle, et faire la logique conditionnelle dans un gestionnaire, comme suit:

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

Y'all sont tous il trop compliquer. Essayez ceci:

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

Vous pouvez également utiliser "repeat while" pour les boucles qui ne se répètent que conditionnellement.

Questions connexes