forループ 1. ループを使う

同じ処理を何度も繰り返すfor文の登場です。
基本形はこんな感じ。

関数と同じで{}にはさまれた部分が繰り返し実行される内容になります。iとかinとか若干意味不明な部分がありますが、当面はそういうものだと思っておきます。特にSwift Playgroundsではfor文のショートカットをタップすれば、基本文法は自動で入力されて、繰り返したい数字を入れるだけですし。とにかく{}で繰り返す内容をサンドすることだけ注意しておきましょう。たまにうっかり}を消してしまったりしがちなので。またこれもfuncと同じく、{と}の間の行は先頭にスペース4つ入れて字下げしておくとコード全体の見通しがよくなるのでオススメです。

このステージでは、「2歩進み宝石を取り、さらに1歩進む」とワープを通って最初の行の2つ隣の列に移動します。なのでこれをパターンとして列の数(5回)繰り返せばクリアできます。
今までなら

などとするところでしょう。しかしいくら関数が繰り返しに便利だといっても、こう単純に何度も同じコマンドを書くのはめんどくさいですし、後で何回繰り返しているのかも数えないとわかりません。
そこで同じことをその場で繰り返すだかならfor文の方が便利というわけです。

コマンド 5. バグを見つけて直す

ある程度完成しているコードからバグ(間違い)を見つけるステージです。
ある行のコマンドが少し早すぎるタイミングで書かれているので、順番を入れ替えて少し後に実行されるように変更する必要があります。

このステージは修正操作の練習でもあります。単純に間違った行を消して、正しい場所に入れ直してもいいんですが、ここでは手順2,3にある方法を試してみてください。
2では移動させたいコマンドをタップします。するとコマンド全体が青色でハイライトされます。
次に3にあるように、青色になった部分を押さえ、指を離さずに押さえたまま指を移動します(ドラッグ操作)。この時、慣れないうちは右手を使うといいでしょう。青い部分をドラッグすると、指がある辺りの先頭(左端)に青い縦線が表示されます(左手だと自分の手に隠れて見辛いので是非右手でやってみてください)。この青線は、「今指を離すとここに移動するよ」という意味です。周りの行が青線を避けるようにニュルっと動いていきます。なので、最初に青くしたコマンドを新しく置きたい場所に青線をあわせて指を離します。
慣れるまでちょっと面倒ですが、憶えておくとちょっと便利です。ただし必須の操作ではありませんので、どうしても上手くできなくても気にせず先に進んで大丈夫です。プログラムを学ぶということとはあまり関係がない裏技のようなものです。

以下が修正後のコードです。

whileループ 7. ループをネストする

ネストという言葉は前にも一度出てきましたね。「入れ子」という意味です。「ループをネストする」というのは「ループの中に別のループを入れる」ということを指します。
どちらも{}という記号でループ内容をサンドしているので、見た目が紛らわしいですが、「ループの中身は行頭を字下げする」という書き方をすると少し見やすくなります。字下げとはインデントとも呼びますが、行の頭に空白を入れて右へズラすことをいいます。Swift Playgroundでは空白(半角スペース)を4つ入れるのを字下げのルールとしているようなので、それに従いましょう。字下げするのはwhile {行と最後の}行の間の処理です。{の後で改行ボタンを押すと自動で空白4つ分字下げをしてくれる場合もあります。今回のようにループがネスト(入れ子)になる場合、内側のループの{}の中身は4+4で8文字分字下げすることになります。ループが深くなればなるほど4文字ずつ右にズレていくイメージです。
字下げはしてもしなくてもプログラムの動きには影響しませんが、コードが複雑になって頭がこんがらがって来た時に必ず助けになりますので、するクセをつけておくと良いでしょう。

さてステージは、うずまき状に内側へと進んでいく作りです。一番中にいくと行き止まって進めなくなるので、全体としては行き止まりまで進むことにします。次に曲がり角ですが、そこには必ず宝石があるようです。「宝石があるまでは直進し、宝石まで来たら(取ってから)左に曲がる」というループを内側に置きます。これを行き止まるまでループするのです。

なお字下げルールは、whileだけでなく、func文やif文など{}で処理内容を挟む場合全般に使用します。

whileループ 6. 方法はたくさん

ステージの長さが毎回変化するので、まずは毎回端まで進むようなループを考えます。
次に真正面に進む間、各コマにスイッチ(開または閉)があり、右側に必ず宝石、その向こうにスイッチが必ず存在します。左端と右端のスイッチは反対になっているようです。
ここもタイトル通りたくさんのやり方が考えられます。

以下の例では、
スイッチの開閉をあまり意識しないで済むよう、「閉ならオンにする」という関数switchOn()を作成し、開閉どちらでもスイッチがあればswitchOnを呼び出す、というコードにしました。ループの中では、メインストリートのスイッチを処理、右の宝石とゲット、さらに向こうのスイッチを処理、戻る、という処理を連続して行っていますが、スイッチの部分に関してはswitchOn()を呼び出すだけにできるので、ループ内の見通しが良くなります。

もう少し無駄のないコードにするとしたら、「そもそもメインストリート上のスイッチが閉だった場合、そこをオンにすれば、反対側のスイッチまでは行く必要がなく、宝石だけとって戻ればいい」という考え方があります。是非チャレンジしてみてください。メインストリート上のスイッチが閉か開から別々の処理に分岐するか別々の関数を呼び出すのです。

whileループ 5. 回る

このステージは本当に色々なやり方ができます。
例はあくまで例として考えて、自分なりのやり方を考えてみましょう。

こちらの例では、まず宝石が2つずつ並んだ辺をひとまとまりのパターンとして、それを4回繰り替えるという考え方をしています。またパターン内で2つの宝石を取るのも移動を含めて繰り返しにできたので、結果として、4回のループの中で2回の子ループを回すという形になっています。辺から辺への移動をどこに入れ込むか、各ループの基点(スタート地点)をどこにするかが思案のしどころでしょう。