メインコンテンツまでスキップ
バージョン:23.4

条件文

条件文を使用すると、スクリプトは選択を行い、特定の条件下でのみ一部のアクションを実行し、他の条件下で他のアクションを実行します。

If ... Then ... Else ...

振る舞い: if 文のすべての形式は条件式を評価し、それは論理値(true または false、または同等の値 yes または no、または on または off)に評価する必要があります。空の値も false として扱われます。条件が true(または yes または on)である場合、SenseTalk は単語 then に続く文または文のリストを実行します。条件が false(または no または off または空)である場合、SenseTalk は単語 else に続く文または文のリストを実行します(存在する場合)。

if 文は次のいずれかの形式をとることができます。

ノート

statement は単一の文であり、statementList は複数の文であり、それぞれが自分の行にあります。else 部分は常にオプションです。

単行

if condition
then statement

if condition then statement else statement

例:

if true then put "Yes!" -- Always puts "Yes!"

例:

if balance < 1000 then put "The balance is getting low"

例:

if the repeatIndex is greater than 5 then LogError "There is a problem." -- When used inside a repeat loop, the repeatindex() function tracks which iteration the repeat loop is on

例:

put 4..10 into numList -- Creates the list '(4,5,6,7,8,9,10)'
repeat with each item of numList -- Iterates based on each item in the list
if it is an even number then log it -- Checks whether the value of the current item is an even number, and if so, logs the value
end repeat

出力:

4
6
8
10

複数行の単一文

if condition
then statement
else statement

if condition {then}
statementList
end if

例:

put the date into dateoftransaction -- Stores the current date into a variable

if dateoftransaction is between date("January 1") and date("June 30")
then put "First half" into transactionperiod
else put "Second half" into transactionperiod

log transactionperiod

複数のステートメントブロック

Syntax: if condition {then}
statementList
end if

if condition {then}
statementList
else
statementList
end if

ノート

複数のステートメントブロックと連鎖条件では、then が行の最後にある場合、必要に応じて省略することも可能です。

例:

if myString contains "testcase" then
delete ")" from myString
delete "(" from myString
log myString
end if

例:

If imagefound("on")
Click foundimagelocation() -- Clicks the location where the previous image "on" was found
else
Click "off"
end if

連鎖条件

最終的に示される「連鎖条件」は、相互に排他的な一連の条件をテストできます。else if ブロックを連鎖させて必要なだけ条件をテストし、最終的に end if の前に else ブロックを配置して、テストした条件のいずれにも一致しないケースを捉えます。より洗練されたアプローチについては、「複数のケースに対するif文」(#multi-case-if)を参照してください。

構文:
if condition1 {then}
statementList
else if condition2 {then}
statementList
end if

if condition1 {then}
statementList
else if condition2 {then}
statementList
else statementList
end if

ノート

チェーンされた条件文では、行末に単語thenが表示される場合、必要に応じて簡潔さのために省略することができます。

例:

if imageFound(image:"DashHome",waitFor:0)
Click "DashHome"
else if imageFound(image:"StartHome",waitFor:0)
TypeText WindowsKey,"r"
WaitFor 8, "RunLine"
else
throw "Image not found", "Desktop not visible." -- Neither of the two conditions are met, so an exception is thrown
end if

複数ケースのif文

挙動: 複数ケースの if 文は、多くの条件と結果を持つ条件文を明確かつシンプルに書くことを可能にします。これは、else if を使って示す通常の代替条件が多くなるときに便利で、構文を単純化します。また、フォールスルーやケースのチェックを続けるステートメントにより、実行のフローをさらに柔軟に制御することができます。

ノート

SenseTalkの複数ケースのif文は、他の言語のswitch文やcase文に似ています。

複数ケースのifの三つの形式

複数ケースの if 文には3つの形式があります。これらの構文のバリエーションは柔軟性を提供し、テストのニーズに合わせて複数ケースの if 文をカスタマイズできます。

全3つの形式では、省略記号 (…) を使用して、テストする条件を初期行とケースを定義するいくつかの後続行の間で分割します。全3つの形式は同じ基本構造に従い、次の要件を順に満たす必要があります。

  • 最初の行は if で始まり、省略記号 (...) で終わる必要があります(この最初の省略記号は、通常の if ... then ... else 条件文ではなく、複数ケースの if 文を書いていることを示しています)。
  • 条件が真と評価された場合(真と評価される場合)に実行されるコードを提供する、少なくとも一つの可能なマッチングケースが存在する必要があります。
  • オプション: else ケース。
  • end if 行。これは複数ケースの if 文の終わりを示します。

異なる形式では、条件文を2つの部分に分割できますが、文内の異なる点で、異なるレベルの柔軟性が可能です。

形式1:if value operator ... (各ケースは値)

この形式では、比較演算子の後の省略記号で条件文を分割します。これは、最初の行で初期値と比較演算子が提供され、各ケースが比較のための第2の値を提供することを意味します。

この形式では、限定的な数の比較演算子を使用できます。これらには以下のものが含まれ、いずれもその変形や否定形(つまり、「is」の他に「=」、「are」、「isn't」、「is not」など)を使用できます:

  • is
  • matches
  • less than
  • greater than
  • less than or equal to
  • greater than or equal to
  • begins with
  • ends with
  • is in
  • contains
  • is within

Syntax:

If expression comparisonOperator ...
    {...} value [then | :] singleStatement     {...} value [then | :]         statementList     {...} {else} {:}         {statementList}
end If

例:

この例は、変数に格納された情報に基づいてアクションを実行するために、マルチケース if 文をどのように使用できるかを示しています。

set monthNumber to the month of "2020-08-19" -- この値はいくつかの方法で設定できます。

if monthNumber is ... -- このマルチケースif文は、提供された日付を見て月の番号を決定し、その月の名前を対応するようにログに記録します。
1 : set monthName to "1月"
2 : set monthName to "2月"
3 : set monthName to "3月"
4 : set monthName to "4月"
5 : set monthName to "5月"
6 : set monthName to "6月"
7 : set monthName to "7月"
8 : set monthName to "8月"
9 : set monthName to "9月"
10 : set monthName to "10月"
11 : set monthName to "11月"
12 : set monthName to "12月"
else :
throw "カレンダーが壊れています!" -- もし月がカレンダーの中のどの月とも一致しなければ、このカレンダーが壊れているという例外を投げます。
end if

log monthName -- "8月"をログに記録します。

形式2: if value ... (各ケースが条件を完成させる)

この形式では、if文の最初の行は初期値のみを提供します。その後、各ケースは条件を完成させるための演算子と、そのケースで実行うべき文を開始します。これにより、単一の値に対して複数の異なるテストを容易に行うことができます。

構文:
If value ...
    ... operator expression [then | :] singleStatement
    ... operator expression [then | :]
        statementList
    {...} {else} {:}
        {statementList}
end If

ノート

形式2を使用する際は、各ケースの前に省略記号が必要です。

例:

この例では、マルチケース if 文を使用して、同じ文の中でさまざまな演算子を使用して同じ値に対する異なるテストを行う方法を示しています。形式2では、下のコードが示すように、ケースはそれぞれがアポストロフィーs ('s) およびドット (.) 文法を使用して評価するプロパティに個別にアクセスできます。

set Wilbur to (nickName:"Wil", lastName:"Wilberforce", age:16)

put Wilbur's nickName & " は..."

if Wilbur's age ...
... is less than 1 then
put "Infant"
... <= 3 then
put "幼児"
... is between 13 and 19 :
put "Teenager"
... less than 18 then put "子供"
... is more than 65 : put "シニア"
else
put "赤ん坊"
end if

出力:

Wil は...
ティーンエイジャー

例:

この例では、アポストロフィーs('s)とドット(.)構文を使用して、個々の名前と年齢のプロパティ(person変数に保存)にアクセスします。

put (name : samantha, age:10) into person

if person…
… 's name begins with "S" then -- アポストロフィーs ('s) 構文を使用して name プロパティにアクセスします。
put "Sで始まる名前"
keep checking cases -- 一つが真と評価されるまで順にケースを確認します。詳細については、「Keep Checking Cases」を参照してください。
… .age < 18 then put "人は未成年" -- ドット(.)構文を使用してageプロパティにアクセスします。
end if

出力:

Sで始まる名前
人は未成年

フォーム3:if ...(各ケースは完全な条件式です)

実行するコードは、一つのコマンドだけを実行する必要がある場合、ケース条件と同じ行に表示することができます。複数のコマンドを実行するには、ステートメントリストを使用します。ステートメントリストは次の行から始まります。これをアクションで見るには、マルチケース if ステートメントの三つの形式のいずれかの構文を参照してください。

Syntax: If ...

    {...} condition [then | :] singleStatement     {...} condition [then | :] statementList     {...} {else} {:} {singleStatement}         {statementList} end If

例:

この例では、ランダムに値を生成し、マルチケース if ステートメント形式 3 を使用して、それらの値に基づいて異なる出力を生成します。この例をコピーしてスクリプトに貼り付け、自分で実行できます。

set x to random (-5,5)
set y to random (-5,5)
put x,y

If ...
... x = 0 and y = 0 :
put "原点にあります!"
... x = 0 :
put "y軸上"
... y = 0 :
put "x軸上"
... x > 0 and y > 0:
put "第一象限"
else
else put "他の象限"
End if

ケース作成と実行フロー

マルチケース if ステートメントの一般的な実行フローは、各ケースが順番にチェックされ、真と評価される (指定された条件が満たされる) かどうかを確認することです。true であることが判明したケースが検出されると、そのケースのコードが実行され、マルチケース if ステートメントの末尾にある end if に続くスクリプト内の次のステートメントに制御がジャンプします。

マルチケース if ステートメントを使用する場合、ケース内で実行フローを変更して、スクリプトの結果を大幅に変更する可能性があります。詳細については、以下の CasesFall Through to Execute Next Case、および Keep Checking Casesを参照してください。

ケースステートメント

個々のケースごとに、複数ケースの if ステートメントの最初の行で不完全なままにされた条件が完了し、そのケースが真と評価されたときに実行するアクションが提供されます。すべての形式のケースは、.. で構成されています。completedConditional [then|:]の後に、そのケースが true と評価されたときに実行されるコードが続きます。各ケースの先頭にある省略記号は通常オプションです (これはフォーム 2 では使用できません)。これは、複数ケースの if ステートメントの最初の行にある必須の省略記号とは異なります。

実行するコードは、1 つのコマンドのみを実行する必要がある場合、ケース条件と同じ行に表示できます。複数のコマンドを実行するには、ステートメントリストを使用します。ステートメント・リストは、次の行から始まります。これを実際に確認するには、マルチケースの if ステートメントの three 形式 のいずれかの構文を参照してください。

特定のケースで何も実行する必要がなく、代わりに実行を「フォールスルー」したい場合は、実行するコードを省略すると、次に見つかったコードが実行されます。それ以外のケースはチェックされません。詳細については、Fall Through to Execute Next Case Statementsを参照してください。

次のケースステートメントを実行するためのFall Through

Fall Through to Execute Next Case は、Fall Through to ExecuteFall Through、または Execute Next Case に短縮することもできます。これにより、ステートメントまたはステートメント リストを使用して、実行が次のケースに進みます。このプロセスでは、ケースは評価されません。次に使用可能なコード行が単純に実行されます。

また、実行可能コードがないケースを記述することでも、同様の効果を引き起こすことができます。これにより、実行可能コードの次のインスタンスに自動的にフォールスルーが発生します。

[**構文:**md Fall Through { to Execute {{the} Next Case} }

Execute {the} Next Case

例:

この例では、Fall Through を使用して、指定された休日と経過時間に基づいて異なるグリーティングを実行していることを示しています。ネストされた if ... そうしたら。。。else conditional を使用して、経過時間に基づいて実行を決定します。マルチケースの if ステートメント全体は、handler を介して実行されます。

put "Halloween" into holiday
Put 25 into age

HolidayGreetings holiday, age

to Handle HolidayGreetings holiday, age -- 与えられた祝日に基づいて挨拶を生成する "to" ハンドラ
if holiday ...
... is "Christmas" then
Put "家族と一緒にビールを飲んで食事を します。"
... is "Thanksgiving" then
put "Happy Autumn"
... is "Halloween" then
put "BOO!"
if age is less than 21 then -- マルチケースifステートメント内にネストされた標準的なif...then...else条件文は、フォールスルーが条件付きで実行されるようにする。
put "Go trick-or-treating!"
else
fall through to next case -- 年齢が21歳を超えている場合、これはフォールスルーし、"St. Patrick's Day"に関連するコードを実行します。そのケースは評価されません。
end if
... is "St. Patrick's Day" then
put "友達とビールを飲んで食事をします。"
fall through -- このフォールスルーのステートメントは、評価されずに "else" を実行します。
... else
put holiday & "を素敵に過ごしましょう!"
end if
end HolidayGreetings

出力:

BOO!
友達とビールを飲んで食事をします。
ハロウィンを素敵に過ごしましょう!

**例)*****。 (`・ω・´) センズトーク answer "結果は: " & [計算機getResult] です。

この例では、スクリプトにテキストを追加せずに Fall Through to Execute Next Case を実行する方法を示します。このように複数のケースを 1 つに結合すると、ステートメントのない任意の数のケースの後に指定された最初の case ステートメントに実行が行き渡ります。

put 9 into x
if x ...
... = 9: -- この行に実行するコードステートメントがないため、デフォルトの動作はFall ThroughしてExecuteです。
... = 10: -- 9がFall Throughとして実行されたため、この値はチェックされません。
... = 11: -- この値も同じ理由でチェックされません。
put "Hooray!" -- xの値が9, 10, または11のいずれかであれば、このステートメントが実行され、"Hooray!"が表示されます。
...>= 12:
put "Boo" -- 値が12以上の場合、このステートメントが実行され、"Boo"が表示されます。
end if

出力:

Hooray!

Keep Checking Cases ステートメント

複数のケースが真と評価される可能性がある状況では、Keep Checking Cases を使用して、1 つのケースが真であると検出された後も評価を続行できます。Keep Checking Cases は、true と評価される別のケースが検出されるまで実行を続行します。その後もケースのチェックを続行するには、別の Keep Checking Cases を含める必要があります。Keep Checking Cases は、ケースの任意の位置に含めることができますが、通常は最後にあります。

構文: keep checking cases

例:

set Wilbur to (nickName:"Wil", lastName:"Wilberforce", age:13)

put Wilbur's nickName & " is a ..."

if Wilbur's age ... -- このマルチケースifステートメントの開始は値、すなわちウィルバーの年齢を指定します。
... is less than 1 then -- このケースは演算子と値を提供します。
put "Infant" -- 上記のケースが真であると判断されたときに実行されるコード。
... <= 3 then
put "Toddler"
... less than 14: -- ウィルバーが13歳なので、この例ではこれが真と判断されます。
put "child"
keep checking cases -- ウィルバーが14歳未満であると判断された場合、実行は続き、次のケースが真であると判断されるまでチェックされます
... is between 13 and 19 : -- ウィルバーが13歳なので、この例ではこれが真と判断されます。
put "Teenager"
keep checking cases-- このケースが真であると判断された場合(この例では真である)、通常はここでスクリプトが停止します(たとえ彼が13歳未満であっても)。このKeep Checking Casesラインは、別の真のケースが見つかるまでケースのチェックを続けることを意味します。
... less than 18 then put "Minor" -- このケースは真と判断されます。なぜなら、ウィるバーは13歳だからです。
... is more than 65 : put "Senior"
else
put "Grown-up"
end if