ついに引数の導入です。
関数は決まった処理をあちこちで何度も実行させるのには便利ですが、ほんのちょっとだけ動きを変えたい時があります。ほぼ同じ内容なんだけど、曲がる向きが右なものと左なものでそれぞれの関数を作って使い分ける、というのは非効率です。そんな時の為に、関数呼び出し時に追加指示を加えるのが引数(パラメータ)です。
関数の呼び出しは伝書鳩を飛ばすようなものだと思ってください。鳩は自分の名前のついた巣(func)へ飛んで行き、funcの番人は鳩が飛んできたのを合図に決められた仕事を開始します。引数は鳩の足にメッセージを結んで飛ばすようなものです。番人は単に鳩が飛んできたという合図だけでなく、足にくくりつけられた伝言をみて、仕事の内容を調整するのです。
今まで私の回答例で何度か、
1 2 3 4 5 |
func move3() { for i in 1 ... 3 { expert.moveForward() } } |
なんて関数を作ってきました。番人は鳩が飛んできたら機械的に一律「3歩進む」という仕事をします。しかしもし2歩や4歩のバージョンも必要になったらどうでしょう?いちいちmove2()やmove4()を作るのでしょうか?それぞれに番人を雇ってたら人件費が大変ですね(笑)。
そんな時に活躍するのがまさにこの引数です。番人に「歩数は毎回伝言で伝えるから、それにあわせて調整してくれ」と約束事を決めるわけです。
1 2 3 4 5 |
func move(distance: Int) { for i in 1 ... distance { expert.moveForward() } } |
のように関数を作っておきます。関数名の後ろにいつも謎の()がついてましたが、ついに中身が入ったわけです。distance(距離)という名前でInt(整数値)を()の中に書けるよ、と宣言しています。そして、for文の繰り返し回数を書いてるところにもdistanceと書かれています。
そして呼び出す時はこう。
1 |
move(distance:3) |
こうすると、呼び出す時に指定した5という数字が、実際に関数の中身が実行される時、distanceと書いたところにかわりに入ってくれます。なので、
1 |
move(distance:2) |
ならfor文は2回繰り返されますし、
1 |
move(distance:4) |
なら4回になります。数字違いのfunc文をたくさん書かなくてよくなるわけです。番人は一人で済みます!
さて、これを踏まえて回答例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//expert君の準備 let expert = Expert() //引数として移動距離を指定できる前進関数 func move(distance: Int) { for i in 1 ... distance { expert.moveForward() } } //ここから本編。move()関数を駆使してクリア move(distance: 6) expert.turnRight() move(distance: 2) expert.turnRight() move(distance: 5) expert.turnLeft() move(distance: 5) expert.turnLeft() expert.turnLockUp() expert.turnLeft() move(distance: 3) expert.turnRight() move(distance: 3) expert.turnRight() move(distance: 4) expert.collectGem() |
なお今回は距離を指定する因数ということでdistanceという言葉を使っていますが、ここは単なる変数の名前なので、その変数の使い道を表したわかりやすいものを使えばOKです。