Applescript odpowiednik "continue"?

Mam proste 'repeat with' W Applescripcie i chciałbym przejść do następnego elementu w "repeat" warunkowo. Zasadniczo szukam czegoś podobnego do "continue" (lub break?) w innych językach.

Nie jestem dobrze zaznajomiony z AppleScript, ale uznałem to za przydatne kilka razy teraz.

Author: danieljimenez, 2009-06-22

6 answers

Szukając dokładnie tego problemu, znalazłem wyciąg z książki w Internecie. Dokładnie odpowiada na pytanie, jak pominąć bieżącą iterację i przejść od razu do następnej iteracji pętli repeat.

Applescript ma exit repeat, który całkowicie zakończy pętlę, pomijając wszystkie pozostałe iteracje. Może to być przydatne w nieskończonej pętli, ale nie jest to, czego chcemy w tym przypadku.

Najwyraźniej funkcja podobna do continue nie istnieje w AppleScript, ale oto sztuczka, aby

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

Wyświetli okna dialogowe dla 1, 2, 4 i 5.

Tutaj stworzyłeś dwie pętle: pętla zewnętrzna jest twoją rzeczywistą pętlą, pętla wewnętrzna jest pętlą, która powtarza się tylko raz. exit repeat opuści pętlę wewnętrzną, kontynuując pętlę zewnętrzną: dokładnie to, czego chcemy!

Oczywiście, jeśli użyjesz tego, stracisz możliwość zrobienia normalnego exit repeat.
 44
Author: Tom Lokhorst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 17:16:57
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

To nadal daje możliwość "powtórzenia wyjścia"

 6
Author: Skeeve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-07 21:31:12
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

Bazując na powyższym podejściu try block, ale czyta się nieco lepiej. Oczywiście, ponieważ continueRepeat nie jest zdefiniowany, zostanie wyrzucony błąd, który spowoduje pominięcie reszty bloku try.

Aby zachować błąd rzucania w Nienaruszonym zawierać klauzulę on error, która rzuca każdy nieoczekiwany błąd.

 4
Author: Daniel Schlaug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-15 09:02:59

-- lub możesz użyć innej strategii: użyj pętli do pętli i wykonaj logikę warunkową w obsłudze, jak tak:

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
Author: Ron Reuter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-20 15:15:06

Wszyscy to komplikujecie. Spróbuj tego:

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
 2
Author: Eurobubba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 18:09:04

Można również użyć "repeat while" dla pętli, które powtarzają się tylko warunkowo.

 1
Author: Simon White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-24 17:35:06