41

我在 AppleScript 中有一个简单的“重复”,并且想有条件地转到“重复”中的下一个项目。基本上我正在寻找其他语言中类似于“继续”(或中断?)的东西。

我不精通 AppleScript,但我发现它现在有用几次。

4

7 回答 7

57

在搜索了这个确切的问题后,我在网上找到了这本书的摘录。它准确地回答了如何跳过当前迭代并直接跳到循环的下一个迭代的问题repeat

Applescript has exit repeat,它将完全结束一个循环,跳过所有剩余的迭代。这在无限循环中很有用,但在这种情况下不是我们想要的。

显然continueAppleScript 中不存在类似 - 的功能,但这里有一个模拟它的技巧:

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

于 2009-06-23T21:10:25.413 回答
7
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

这仍然会给你“退出重复”的可能性

于 2010-11-07T21:31:12.983 回答
6
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 子句。

于 2011-05-15T07:57:10.380 回答
3

-- 或者你可以使用不同的策略:使用循环来循环,并在处理程序中执行条件逻辑,如下所示:

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
于 2013-02-20T15:10:36.370 回答
2

你们都把它复杂化了。尝试这个:

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
于 2013-02-22T18:09:04.753 回答
1

您还可以对仅有条件地重复的循环使用“repeat while”。

于 2016-01-24T17:35:06.013 回答
0

根据 Tom Lokhorst 的回答,这里有一个变体,可以根据您设置的变量执行breakor 。为此,在外部(非假)循环的末尾,您添加continueisExit

if isExit then
    exit repeat
end if

这样如果isExit为真,您也只需退出外循环,成为有效的break.

原始问题/答案:

对于原始问题问题,这看起来像这样,下面将是一个概括的问题。

set aList to {"1", "2", "3", "4", "5"}

repeat with anItem in aList -- actual loop
    set isExit to false
    repeat 1 times -- fake loop
        -- do your stuff
        set value to item 1 of anItem

        if value = "3" then 
            -- simulated `continue`
            set isExit to false
            exit repeat
        end if

        if value = "69" then 
        -- simulated `break`
            set isExit to true
            exit repeat
        end if
        
        display dialog value
    end repeat

    if isExit then
        exit repeat
    end if
end repeat

广义的

因此,将其分解为一个更简单的示例:

假设您希望在这两个s中拥有一个continue或其中一个。您可以将所有代码放在它们之间,我只包含与不同退出策略相关的代码。breakif

如果你想写这样的东西:

repeat <condition_repeat>
    if <condition_continue> then
        continue
    end if
    if <condition_break> then
        break
    end if
end repeat

那可以写成

repeat <condition_repeat>
    set isExit to false                -- added 
    repeat 1 times                     -- added 
        if <condition_continue> then
            set isExit to false        -- changed
            exit repeat                -- changed
        end if
        if <condition_break> then
            set isExit to true         -- changed
            exit repeat                -- changed
        end if
    end repeat                         -- added
    if isExit then                     -- added
        exit repeat                    -- added
    end if                             -- added
end repeat
于 2021-02-16T12:30:06.040 回答