2009-06-21 5 views
31

У меня есть простой «повтор с» в AppleScript и хотелось бы перейти к следующему элементу в «повторении» условно. В основном я ищу что-то похожее на «продолжить» (или перерыв?) На других языках.Applescript эквивалент «продолжить»?

Я не хорошо разбираюсь в AppleScript, но я нашел его полезным несколько раз.

ответ

42

После поиска этой точной проблемы я нашел это book extract онлайн. Он точно отвечает на вопрос о том, как пропустить текущую итерацию и перейти прямо к следующей итерации цикла repeat.

Applescript имеет exit repeat, который полностью завершит цикл, пропуская все оставшиеся итерации. Это может быть полезно в бесконечном цикле, но это не то, что мы хотим в этом случае.

Видимо continue -как функция не существует в AppleScript, но здесь есть уловка, чтобы имитировать его:

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 

Это будет отображать диалоговые окна для 1, 2, 4 и 5.

Здесь вы создали две петли: внешний цикл - это ваш фактический цикл, внутренний цикл - это цикл, который повторяется только один раз. exit repeat выйдет из внутреннего цикла, продолжая внешний цикл: именно то, что мы хотим!

Очевидно, что если вы используете это, вы потеряете возможность сделать нормальный exit repeat.

+1

Код, указанный выше, не будет компилироваться, потому что комментарии в applescript - не # – alexy13

+1

В applescript 2.0 знак # также разрешен для комментариев: https://developer.apple.com/library/mac/documentation/applescript/ концепт/applescriptlangguide/conceptual/ASLR_lexical_conventions.html # // apple_ref/doc/uid/TP40000983-CH214-SW8 – Joakim

+0

Код будет компилироваться, потому что «-» предшествует всем «#», а «-» всегда отмечал комментарий в 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 

Это все равно даст вам «выход повторить» 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 

На основе подхода, основанного на попытки блока выше, но читает немного лучше. Конечно, поскольку continueRepeat не определен, будет выведена ошибка, из-за которой остальная часть блока try будет пропущена.

Чтобы сохранить неповрежденную ошибку, включите условие on error, которое вызывает любую непредвиденную ошибку.

2

- Или вы могли бы использовать другую стратегию: использовать цикл в цикле, и сделать условную логику в обработчике, например, так:

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 все усложнять его. Попробуйте следующее:

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

Вы также можете использовать «repeat while» для циклов, которые повторяются только условно.