web-dev-qa-db-ja.com

「続行」に相当するApplescript?

AppleScriptに単純な「repeatwith」があり、条件付きで「repeat」の次の項目に進みたいと思います。基本的に私は他の言語で「続ける」(または中断する?)に似たものを探しています。

私はAppleScriptに精通していませんが、今では何度か便利だと思っています。

35
danieljimenez

この正確な問題を検索した後、私はこれを見つけました 本の抜粋 オンライン。これは、現在の反復をスキップして、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のダイアログが表示されます。

ここでは、2つのループを作成しました。外側のループは実際のループであり、内側のループは1回だけ繰り返されるループです。 exit repeatは内側のループを終了し、外側のループを続行します。まさに私たちが望むものです。

明らかに、これを使用すると、通常のexit repeatを実行できなくなります。

48
Tom Lokhorst
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

これはまだあなたに「出口リピート」の可能性を与えます

7
Skeeve
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ブロックがスキップされます。

エラースローをそのまま維持するには、予期しないエラーをスローするonerror句を含めます。

6
Daniel Schlaug

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
3
Eurobubba

-または、別の戦略を使用することもできます。ループを使用してループし、次のようにハンドラーで条件付きロジックを実行します。

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
Ron Reuter

条件付きでのみ繰り返されるループには、「repeatwhile」を使用することもできます。

1
Simon White