ひとつの関数に引数を2つ以上もたせることも出来ます。
1 |
ステーキ.オーダー(焼き加減:ミディアム, ソース:ガーリック) |
てなもんです。
今回はturnLockという関数に、upとnumberOfTimesという2つの変数をぶらさげます。upはBool型とあります。Bool型はtrueかfalseのどちらかが入るんでした。upがtrueだったら移動板が上がり、falseなら下がるように関数を作るというお題です。またnumberOftimesはその上げ下げ作業をする回数です(Int型なので数字が入ります)。例えば、
1 |
turnLock(up:true, numberOfTimes:3) |
としたら、板を上げる処理を3回分する、という動作にするわけです。
(upという変数名はちょっとわかりにくいかも知れません。今までのルールだと、isUp(upかどうか)という名前で考えた方がピンとくるでしょうか?)
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
//2体のインスタンスを準備 let expert = Expert() let character = Character() //お題の関数 func turnLock(up: Bool, numberOfTimes: Int) { //回数のところに数字ではなくnumverOfTimesを指定。なんだそれ?となったら上をみると、どうやら毎回伝言で指示されるらしいぞ、と... for i in 1 ... numberOfTimes { if up == true { //ここのupも伝言(=引数)待ち。伝言がtrueならすぐ下、falseならelse以下が実行されます。 expert.turnLockUp() } else { expert.turnLockDown() } } } //ここから本編。お題の関数を活用してクリア turnLock(up:true, numberOfTimes:3) //上へ3回 expert.turnLeft() expert.turnLeft() turnLock(up:true, numberOfTimes:3) //上へ3回 character.move(distance: 3) character.collectGem() character.turnLeft() character.turnLeft() character.move(distance: 2) turnLock(up:false, numberOfTimes:3) //下へ3回 character.turnLeft() character.move(distance: 1) character.turnRight() character.move(distance: 1) character.collectGem() character.turnRight() character.turnRight() character.move(distance: 1) turnLock(up:true, numberOfTimes:1) //上へ1回 expert.turnRight() expert.turnRight() turnLock(up:false, numberOfTimes:2) //下へ2回 character.move(distance: 2) character.collectGem() |
ちなみに、自分で用意した関数を呼び出す時、その対象として、先頭に「expert.」をつけるべきかどうか気になった方もいるかも知れません。現状ではつけてもつけなくても動作は同じみたいです。一方、関数の中ではexpert.をつけないとエラーになりますし、そっちで対象を指定しているので、関数全体としては不要と考えれば良いでしょう。turnLeft()はつけるのにturnLock()はつけない、というのが気持ち悪い、という方もいるかも知れないですが、手間が減るしつけない方をオススメします。たぶん正式なSwiftの文法としてもそれが正しいはずです。