【Swift】外部引数名を使って関数の呼び出しをイメージしやすくする。(Swift 2.1、XCode 7.2)
外部引数名とは
外部引数名とは、関数を呼び出すときの引数名に必ず名前をつけさせる方法である。
通常、関数を呼び出すときは以下のコードのように、第1引数に「値のみ」、第2引数以降には「変数名と値」を与える。第1引数には引数名はつけたら駄目で、第2引数以降は引数名をつけなければならないという使い方には違和感があり、しっくりこない。そこで利用されるのが外部引数名である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * 引数が複数個の関数を定義 */ func testFunction(c:String, k:Int, s:Int) { print("\(c)は気温\(k)度、湿度\(s)%です") } //引数ありで実行 testFunction("東京", k:38, s:55 ) //実行結果 //東京は気温38度、湿度55%です |
外部引数名の定義方法
以下のコードのように外部引数名は引数名の前に記述する。外部引数名を付けると、関数を呼び出すときに全ての引数に外部引数名をつけなければならなくなる。統一感があってしっくりくる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * 引数が複数個の関数を定義 */ func testFunction(city c:String, kion k:Int, shitsudo s:Int) { print("\(c)は気温\(k)度、湿度\(s)%です") } //引数ありで実行 testFunction(city:"東京", kion:38, shitsudo:55 ) //実行結果 //東京は気温38度、湿度55%です //第1引数に外部引数名を与えないとエラーになる。 testFunction("東京", kion:38, shitsudo:55 ) //実行結果 //error: missing argument label 'city:' in call |
外部引数名と引数名が同じときに「city city」のように引数名を2つ書かなくてもいいように、「#引数名」と書いて1つで外部引数名と引数名を表す方法があった。Swift 2.1.1で使ってみたところ「’#’ has been removed from Swift; double up 'city city’ to make the argument label the same as the parameter name」というエラーが発生した。
どうやら使えなくなったようだ。
1 2 3 4 5 6 7 8 9 10 11 |
/* * #を使ってで外部引数名と引数名を同時に定義する */ func testFunction(#city:String, kion:Int, shitsudo:Int) { print("\(city)は気温\(kion)度、湿度\(shitsudo)%です") } //実行結果 エラー //’#’ has been removed from Swift; double up 'city city' to make the argument label the same as the parameter name |
外部引数名と引数名を同じにする場合、以下のコードのように第1引数にだけ同じ引数名を2回記述する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * 外部引数名と引数名を同じにする場合の定義 */ func testFunction(city city:String, kion:Int, shitsudo:Int) { print("\(city)は気温\(kion)度、湿度\(shitsudo)%です") } //引数ありで実行 testFunction(city:"東京", kion:38, shitsudo:55 ) //実行結果 //東京は気温38度、湿度55%です |
逆に、関数呼び出し時の引数に引数名をつけたくない場合もある。むしろそっちの人の方が多いような気もする。そのようなときは、関数定義の引数名の前に「_ 」(アンダースコアと半角スペース)を付けると、関数を呼び出すときに引数名をつけることが出来なくなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * 関数呼び出し時に外部引数名を記述できなくする */ func testFunction(city:String,_ kion:Int,_ shitsudo:Int) { print("\(city)は気温\(kion)度、湿度\(shitsudo)%です") } //引数名を指定せずに実行 testFunction("東京", 38, 55 ) //実行結果 //東京は気温38度、湿度55%です |