Вопрос

У меня есть простое «повторить с» в 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; для циклов, которые повторяются только условно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top