Applescript эквивалентно & # 8220; continue & # 8221 ;?
-
06-07-2019 - |
Вопрос
У меня есть простое «повторить с» в AppleScript, и я хотел бы перейти к следующему пункту в " repeat " условно. По сути, я ищу что-то похожее на «продолжить» (или перерыв?) на других языках. Р>
Я не очень разбираюсь в AppleScript, но я нашел его полезным несколько раз.
Решение
После поиска именно этой проблемы я обнаружил выписка из книги онлайн. Это точно отвечает на вопрос, как пропустить текущую итерацию и перейти прямо к следующей итерации цикла 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
выйдет из внутреннего цикла, продолжая с внешнего цикла: именно то, что нам нужно!
Очевидно, что если вы воспользуетесь этим, вы потеряете возможность делать обычный повторение выхода
.
Другие советы
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 р>
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
Основано на подходе, основанном на блоке try, но читается немного лучше. Конечно, поскольку continueRepeat не определен, будет выдана ошибка, которая приведет к пропуску оставшейся части блока try. Р>
Чтобы ошибка не вызывала ошибок, включите условие on error, которое генерирует любую непредвиденную ошибку.
- Или вы можете использовать другую стратегию: использовать цикл для цикла и выполнять условную логику в обработчике, например, так:
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
Вы все усложняете это. Попробуйте это:
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
Вы также можете использовать & # 8220; повторить пока & # 8221; для циклов, которые повторяются только условно.