【Swift】関数の使い方。特定の処理をする小分けにされたプログラム。(Swift 2.1、XCode 7.2)
関数とは
関数とは、特定の処理をする小分けにされたプログラムのことである。プログラムの中で何度も繰り返す一連の処理をそのまま記述すると、似たようなコードが散在してソースが見づらくなるとともに、修正が必要になったときのデバッグに時間がかかってしまう。
そのようなときは、一連の処理を関数として切り出し、呼び出して使うことでソースがすっきりし、修正箇所を限定することができる。
関数は以下のように定義する。引数が無い場合は省略し、複数ある場合はカンマで区切りながら連続で記述する。
1 2 3 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 28 29 30 31 32 33 34 35 36 |
/* * 冗長なソースコードの例 */ var test1 = 33 //新潟の気温 var test2 = 38 //東京の気温 print("新潟"); if(test1 > 35) { print("猛暑日\n") }else if(test1 > 30) { print("真夏日\n") }else if(test1 > 25) { print("夏日\n") }else{ print("無し\n") } print("東京"); if(test2 > 35) { print("猛暑日\n") }else if(test2 > 30) { print("真夏日\n") }else if(test2 > 25) { print("夏日\n") }else{ print("無し\n") } //実行結果 //新潟 //真夏日 // //東京 //猛暑日 |
そこで、上記のコードで冗長となっている分岐処理と画面出力を関数として切り出して、関数を呼び出して使うようにしたのが以下のコードになる。判定処理が1つになってスッキリした。
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 |
/* * 関数を使って冗長なコードを無くす */ func outputSummerDay(city:String, temperature:Int) { print(city) if(temperature > 35) { print("猛暑日\n") }else if(temperature > 30) { print("真夏日\n") }else if(temperature > 25) { print("夏日\n") }else{ print("無し\n") } } outputSummerDay("新潟", temperature:33) outputSummerDay("東京", temperature:38) //実行結果 //新潟 //真夏日 // //東京 //猛暑日 |
引数の特徴
関数の定義で引数を指定している場合、そのままでは関数を呼び出すときに必ず引数を与えなければならない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * 引数ありの関数 */ func testFunction(city:String) { print("\(city)にいます。") } //引数ありで実行 testFunction("東京") //実行結果 //東京にいます。 //引数なしで実行 testFunction() //実行結果 引数なしのエラーが発生 //error: missing argument for parameter #1 in call |
ただし、関数の定義で引数に初期値を設定すると、引数なしでも関数を呼び出せるようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * 引数に初期値を設定 */ func testFunction(city:String = "沖縄") { print("\(city)にいます。") } //引数ありで実行 testFunction("東京") //実行結果 //東京にいます。 //引数なしで実行 testFunction() //実行結果 //沖縄にいます。 |
複数個の引数を持つ関数を定義した場合は、以下のコードのように呼び出すときの第2引数以降に引数名を記述する必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * 引数が複数個の関数を定義 */ func testFunction(city:String, kion:Int, shitsudo:Int) { print("\(city)は気温\(kion)度、湿度\(shitsudo)%です") } //引数ありで実行 testFunction("東京", kion:38, shitsudo:55 ) //実行結果 //東京は気温38度、湿度55%です //引数名をつけずに呼び出し testFunction("東京",38,55) //実行結果 //error: missing argument labels 'kion:shitsudo:' in call |
引数が1個の場合と同様に、すべての引数に初期値を設定すれば引数なしでも実行できるようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * 引数が複数個の関数に初期値を設定 */ func testFunction(city:String = "沖縄", kion:Int = 40, shitsudo:Int = 60) { print("\(city)は気温\(kion)度、湿度\(shitsudo)%です") } //引数ありで実行 testFunction("東京", kion:38, shitsudo:55 ) //実行結果 //東京は気温38度、湿度55%です //引数なしで実行 testFunction() //実行結果 //沖縄は気温40度、湿度60%です |
以下のコードのように第1引数の後ろにピリオドを3つつけると何個でも引数を与えて呼び出すことができるようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* * 引数の個数を限定しない。 */ func testFunction(city:String...) { //cityはコレクションになる for str in city { print(str) } } testFunction("東京","大阪","名古屋","愛媛") //実行結果 //東京 //大阪 //名古屋 //愛媛 |
戻り値
戻り値とは、関数を呼び出したときに関数から返ってくる値のことをいう。以下のコードように関数の引数のあとに「-> 戻り値の型」を記述することで値を返す関数を定義することができる。処理の中で「return 値」と記述すると関数の処理が終了し、呼び元に値を返す。
1 2 3 4 5 |
//戻り値のある関数 func 関数名(引数名:データ型,...) -> 戻り値の型{ 処理 return 戻り値 } |
以下のコードはInt型の引数を2つ受けとり、それぞれ二乗して足し合わせたInt型の値を返す関数である。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* ** 2つの引数を二乗して足した値を返す関数 */ func calcTest(data1:Int, data2:Int) -> Int { return data1 * data1 + data2 * data2 } print(calcTest(2, data2:4)) //実行結果 //20 |
戻り値を返さない関数は「-> 戻り値」を省略すればいいが、戻り値を返さないことをアピールするために「-> ()」、「-> Void」と記述しても戻り値を返さない関数になる。
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 |
/* ** 戻り値を返さない関数 */ //書き方1 戻り値の型を書かない。 func printHello(data:String) { print("おはようございます。\(data)さん"); } //書き方2 ()を記述する。 func printGoodEvening(data:String) -> () { print("こんにちは。\(data)さん"); } //書き方3 Voidを記述する。 func printGoodNight(data:String) -> Void { print("おやすみなさい。\(data)さん"); } printHello("山田") printGoodEvening("舛添") printGoodNight("佐藤") //実行結果 //おはようございます。山田さん //こんにちは。舛添さん //おやすみなさい。佐藤さん |