【入門者向け⑧】if文 その3 ~true/false/else~
実際に入門者として読んでくださってる方は、タイトルを見て
「うほっ、来た来た……いかにもプログラムっぽい単語が……」
とゾワゾワしているかもしれませんね。でもここまでif文について読まれた方であれば、さほど難しいことはありません…
場合によっては「if文って便利だなー」という感想を抱くのではないでしょうか。if文は本当に便利です。
1. trueとfalse(真と偽)
「真と偽ってなんだよ!」という方もいれば、「なんかExcelで見たことある!」という方もいるのでは。ExcelのIF関数でもお馴染みですね。
日常会話でいうところの「正解・不正解」「一致・不一致」「オン・オフ」「◯・✕」的な言葉です。プログラムのセカイではこれらを「真(true)か偽(false)」で表すのですね。つまりはこんな感じです。
サザエさんの作者は長谷川町子である = true(真)
ワカメはカツオの妹である = true(妹なので真)
カツオはタラオの兄である = false(おじなので偽)
波平の身長は178cm = true(178cmなので真。意外とデカイですね…)
ノリスケは早大卒である = false(東大卒なので偽)
…なんだかサザエさんの雑学クイズみたいになっていますが、trueかfalseかはこんな感じで使います。
こうした「真か偽か」という値を持つ変数の型を「boolean」といい、「ブーリアン」とか「ブール」と呼ばれています。
このブール式は、InDesignスクリプトでは次のような感じで出てきます。
① layers[0].locked = true;
② layers[0].visible = false;
①も②もレイヤーの状態に関する文です。
①のlockedは「レイヤーのロック状態」という文で、右辺がtrueであれば「ロックされている」ということになります。「false」は非ロック。
②のvisibleは「レイヤーの表示状態」で、trueであれば「表示(見える)」、falseであれば「非表示(見えない)」です。
こんなふうに、InDesignスクリプトでは機能の設定が「オンかオフか」の判断時にブールを使うことが多いです。
自分で新たにブール式を作成することもできるのですが、それは別な機会で…(正直を言うと、私もあまり使ったことがありません…)
if文とは関係ないですが、次のように書けば、レイヤーのロック/非ロック・表示/非表示の状態をコントロールすることができます。
※試す場合は新規文書を作成してから実行してください※
var layObj = app.activeDocument.layers[0]; layObj.locked = true;//レイヤーをロックする layObj.visible = false;//レイヤーを非表示にする
1つのレイヤーが、ロックかつ非表示の状態になったと思います。
ではこのブールにforとifを絡めたスクリプトを書いてみましょう。
新規文書にレイヤーを10個ほど追加し、そのうちのいくつかをロック状態にしてください。
[例1]は「現在のロック状態を調べさせて条件判断を行い、trueならば処理を実行する」というスクリプトです。
実行すると、「ロック状態のレイヤーのみ、レイヤー名が『ロックレイヤー+連番』」になります。
[例1]ロックされたレイヤーのレイヤー名を『ロックレイヤー+連番』にする
var layObj = app.activeDocument.layers; var j=1;//連番用の変数 for (var i=0; i<layObj.length; i++) { if (layObj[i].locked == true) {//trueならば、という文 layObj[i].name = "ロックレイヤー"+[j]; j++ } }
ループの外で宣言している「j」という変数が、レイヤー名の連番の部分になります。
ループの「i」でも連番にできそうですが、「if」に選ばれなかったときにもカウンタが進んでしまうので、番号が飛び飛びになってしまいます。
2. else(条件にあてはまらないものへの処理)
ここまで3記事に渡って説明してきたif文を使い、「条件分岐で、条件にマッチしたものへの処理」が行えるようになりました。
[例1]で言うならば、「ロックされたレイヤーに任意のレイヤー名を付けることが出来るようになった」わけです。
では条件に当てはまらなかったものはどうでしょう。[例1]の非ロックレイヤーにも名前を付けたい場合は、非ロックレイヤーを条件にしたスクリプトも書かなくてはいけないのでしょうか。
もちろんtrueの場合とfalseの場合の両方の処理を書くことも可能ですが、if文では「else」という文を使って「条件に当てはまらなかったものへの処理」をあわせて指定することが出来ます。
elseを加えたif文の書き方はこんな感じです。
if(条件){
条件が成立した場合の処理
} else {
条件にあてはまらなかった場合の処理
}
[例1]を書き直して、「ロックレイヤーと非ロックレイヤーにそれぞれ名前を付ける」という処理のスクリプトを書いてみましょう。
※スクリプトを実行する前に、新規文書を作成し、レイヤーを10個ほど追加し、そのうちのいくつかをロック状態にしてください。
[例2]ロックレイヤーには『ロック+連番』、非ロックレイヤーには『非ロック+連番』という名前を付ける
var layObj = app.activeDocument.layers; var j=0; for (var i=0; i<layObj.length; i++) { if (layObj[i].locked == true) { layObj[i].name = "ロック"+[j] j++ } else { layObj[i].name = "非ロック"+[j]}//あてはまらないときの処理を書く j++ }
ロックされているレイヤー、されていないレイヤーそれぞれに名前が付けば成功です。
if文、便利ですね!
以前の記事で書いたコマンドバトルのスクリプトでも、いろいろな役割でif文が登場します。
(いいえボタンが押されたら…HPが0になったら…から会心の一撃判定まで)
良かったらそちらも読んでみてください。
「条件に当てはまらなければ」という書き方ができるのはとても便利ですね。
ちなみに条件文の「==true」や「!=true」は省略することができます。
下図参照
if (layObj[i].locked == true) //↓こう書いてもOK if (layObj[i].locked) if (layObj[i].locked != true) //↓こう書いてもOK if (!layObj[i].locked)
次回は「複数の条件での条件分岐」を書くつもりです…
記事が気に入ったら、スターボタンかブックマークボタンをクリックしていただると幸いです!