Swiftはじめました 第6回
こんにちは。ツクリテ業務担当のムゥです。
10月、そろそろ秋めいてくるのでしょうか。。冬服の出番を目前に秋服を買うのは負けた気がするのは何故だろう。
話は逸れましたが、今回も最後までお付き合いくださいませ!
前回まで
2回に渡ってお送りしたforループですが、前回をもってお題も終了しました。
for i in 1 ... ◯ {
codeA
codeB
}
◯には繰り返したい回数を、codeAやBには繰り返したい作業を定義するというもでした。
繰り返しを指示できるというのはとても便利ですね。
組み立てに少し難しいところもありましたが、お題ごとの解説に何度も助けられました。
なんとかなって良かったと安心しています。
今回から、また新しく条件分岐コードを学んでいきますが、最後まで見守っていただければと思います!
条件分岐コードとは
簡潔にいうと、私の印象ではif関数と同じようなものです。
もし〜だったら◯◯をする。みたいなことですね。
怪しい説明になってしまいましたが、説明動画を見ればご納得いただけるかと!
はい、見てお分かり頂けましたよね?
条件分岐コードとは、条件に合わせて動作を指定するコードの学習で す。
この動画見ただけで、震えてます私。
とはいえね、今までなんやかんやとありましたがここまで来たので。
一握りの勇気を持って進んでいこうと思いますので、一緒に頑張りましょう。
さっそく最初のステージにいってみましょう!
ここでのお題は、スイッチが入っていないものだけONにするというもの。
画像を見ると、黄色で囲っているスイッチはすでにONになっていて、赤丸の方のスイッチはOFFになっています。
この3つのスイッチを「OFFのみONにする」という動作を指示するコードを書かなくてはなりません。。
ここで使うのはこのコード
if 〇〇 {
〜()
}
◯の部分には条件を、〜の部分にはその条件に一致している場合の動作を入力すれば良いんです。
では、コードを書いてみましょう!
条件の箇所には isOnClosedSwitch (切れているスイッチの上にいる)を使えばいいとのことで、早速コーディングをしてみました。
切れているスイッチの上にいる場合、スイッチを押す(toggleSwitch) という条件なので、切れていないスイッチ の上にいる時は何もしないってことですね。
最初のステージなので初歩的なものでした。すんなりといけてよかった・・・
次のステージでは少し難易度が上がり、新しくelse if というコードが登場。
これはどういうものかというと、、、下の図を御覧ください。
ifの条件Aに該当しなかった場合、else ifの条件Bでは該当するか確認し、動作を指定することができるというものです。
分岐が増えるということですね。
では早速やってみましょう!
ここでの条件は2つ必要です。
切れているスイッチの上にいる
ジェムの上にいる
あとはこれらの条件に該当した場合のそれぞれの動作を指定するだけ・・コードにするとこんな感じになります!
if isOnClosedSwitch {
toggleSwitch()
} else if isOnGem {
collectGem()
}
ここも割と優しい感じでしたね。。まだまだ序の口というところでしょうか。。
次のステージではforループに条件分岐コードを組み込んでミッションを達成するというものでしたが、コードは前回書いたものと同じだったのでここでは成功動画のみお届けします。
続いては、elseブロックを使ってのお題。ここでまた新しい用語の登場です。
条件の値が、当てはまる(true)か当てはまらない(false)のどちらかになる値をブール値と呼ぶそうです。へぇって感じですよね。
そしてこのステージ、なかなかに小憎たらしかったです。
解説にあるようにfalseの場合にどういう行動をするか、elseブロックを使って定義しなくてはならないのですが、これは else if のことではないんです。
私は、else ifを使わなきゃいけないの!?と迷走していたのですが、名前が似ているだけで別物なんですよね。
elseブロックは、ifの条件がfalseの場合の動作を定義するものなので、すでに前提条件が決まっているため、else ifのように条件を提示する必要が無いのです。
そうしてそのコードをforループに組み込むのですが、ここでまたちょっと躓いてました。
forループは繰り返す回数を指定できるコードでしたよね?
この回数がここのステージでは落とし穴で、しず太郎が途中で止まってしまうというのを何度か繰り返していました。。。
ひとまず最後まで辿り着くことを最優先とし、回数を増やしながら進めてなんとかクリア。
「ブールの達人ですね!」って褒められてますが、依然、何故止まるのか全くわからない。。。コードと画面のマスを見てしばらく考え込んでいました。
熟考の末、進むマスの数と繰り返し回数が一致しないヒントは、コードの中にありました。
for i in 1 ... 16 {
if isOnGem {
collectGem()
turnLeft()
} else {
moveForward()
}
}
ジェムの上にいる時はジェムを取って左を向き、ジェムの上にいない時は前に進む を16回繰り返すというコードです。
進むマスは12マスですが、この4マスの差異はなんだろう?って考えました。
そして、ようやく理解。。進むマスに気を取られていて失念していたのですが、ジェムの上にいる→true→ジェムを取る という行動でループの1回が消費されているため、しず太郎はその場から動いてはいないんですよね。(falseだった場合の行動は起きないため)
なので、falseである場合の行動(moveForward())がジェムの数と同数足りていなかったというわけです。
なんてこった。。。
理由がわかってスッキリしました!
今後のためにも正解の道筋は理解しておくべきだなぁとしみじみと思いました。
今回は今までに比べて立ち止まる部分が多かった気がします。
コーディングというものに日頃から触れている人には、ありえない躓きだったかもしれんですね。
次回も、引き続き条件分岐コードの回になります。
難易度があまり上がらないことを祈りながら今回はここまで!
それではまたお会いしましょう♫