我在AppleScript中有一个简单的'重复',并希望有条件地转到“重复”中的下一个项目。基本上我在寻找其他语言类似“继续”(或休息?)的东西。
我不熟悉AppleScript,但我现在发现它很有用了几次。
答案 0 :(得分:44)
在搜索到这个问题之后,我在网上发现了这个book extract。它完全回答了如何跳过当前迭代并直接跳转到repeat
循环的下一次迭代的问题。
Applescript有exit repeat
,它将完全结束循环,跳过所有剩余的迭代。这在无限循环中很有用,但在这种情况下不是我们想要的。
显然,AppleScript中不存在类似continue
的功能,但这是一个模拟它的技巧:
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 :(得分: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
这仍然会给你“退出重复”的可能性
答案 2 :(得分: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子句。
答案 3 :(得分: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
答案 4 :(得分: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
答案 5 :(得分:1)
您也可以使用“repeat while”来循环,只能有条件地重复。
答案 6 :(得分:0)
基于 Tom Lokhorst 的 answer,这里有一个变体,可以根据您设置的 break
变量执行 continue
或 isExit
。
为此,在外部(非假)循环的末尾,您添加
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
所以把它分解成一个更简单的例子:
假设您希望在这两个 continue
中包含 break
或 if
。
您可以将所有代码放在它们之间,我只包含与不同退出策略相关的代码。
如果你想写这样的东西:
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