関数と引数・発展編
(0)関数と引数のおさらい
関数とは「何か便利なことをしてくれるプログラムのまとまり」です。
たとえば足し算をする関数「addition」を書いてみましょう。
func addition(x: Int,y: Int) -> Int{ return x + y }
この関数を呼び出して、xに「5」、yに「3」を渡すと、x + yの結果である「8」が返ってきます。
この8を関数の「戻り値」と言います。
関数を呼び出すときは以下のように書きます。
//引数xとして3、引数yとして5を渡して関数additionを呼び出す。処理結果を入れておく定数「total」を作成する let total: Int = addition(x: 3,y: 5) print(total) //結果をプリントする
プログラミングでは、例えば「計算をする」という処理と「結果を表示する」という処理は別物なので、
結果を導いた後、結果を表示する「total」という変数を作って呼び出しています。
関数、引数、戻り値の理解が進んでいないようなら、文法ドリル3をもう一度読み返してみましょう。
(1)外部引数名
関数、引数、戻り値について初級の学習は終えました。
以下では、少し発展的な学習をします。
まずは、以下のように関数を書いてください。
func areaOfSquare(a: Int,b: Int) -> Int{ let result = a * b return result }
これは、長方形の計算をする関する「areaOfSquare」です。
この関数を呼び出してprintするときは、例えば以下のように書きます。
let total = areaOfSquare(a: 10,b: 5) print(total)
この文は間違っていないのですが、いざ入力をしようとすると「縦の長さを入力するときはa?それともb?」と
悩ましくなります。
そんな時は、関数の1行目を以下のように書き換えれば、縦と横がわかるようにできます。
func areaOfSquare(width: Double, height: Double)
ただし、この書き方でも問題があります。
例えば「縦幅10センチ」入力しようとすると「あれ、この単位ってcmだっけ? mmだっけ?」となるからです。
コメントで「これはcmで書きます」と書いてもいいのですが、読んですぐにわかる方がいいですよね。
そこで、関数の1行目を以下のように書き換えてみてください。
func areaOfSquare(cm width: Double, cm height: Double)
こうすると、縦も横もわかりますし、単位もcmで入力すればいいことが明らかです。
このコードの「cm」の部分を「外部引数名」と言います。
外部引数名は省略できます。これまで書かなくて良かったのは、引数の変数名を外部引数名として利用しているからです。
練習問題(制限時間10分)
(1)円の面積を求めるための関数「areaOfCircle」を定義してください。その際、2つの引数名「radius」「pi」の型を小数点に対応させてください。
(2)関数「areaOfCircle」を呼び出し、radiusとpiにそれぞれ「2.0」「3.14」の引数を渡して、その処理結果を定数「total」で表示してください。
(2)引数名なしで入力できる関数
外部引数名の続きです。
まずは、以下のように関数を書いてください。
func areaOfSquare(_ width: Int, _ height: Int) -> Int { let result = width * height return result }
長方形の計算をする関する「areaOfSquare」です。ですが、先ほど学んだ外部引数名の部分が「_」(アンダーバー)に
なっています。これは、引数名を付けずに値を渡すだけで利用できるのが特徴です。
試しに、この関数「areaOfSquare」を次のように書いて呼び出してみてください。
let total = areaOfSquare(10, 5) print(total)
うまくいきましたか?
Xcodeの機能で、引数を入力しようとすると、下の画面のようにコードのヒントが出てきます。
これは、数字だけ入力しようとすると「どっちが縦だっけ?横だっけ?」となるのを防ぐために、
Xcodeが「最初に入力する数字が横だよ」と教えてくれています。
何でも単位や数字があるとわかりやすいのですが、何度も入力するのは手間がかかります。
また、コードが長くなると書き間違いや書き損じも生まれてきます。
それらを防ぐために、引数名を省略できる機能がついています。
自分でプログラムを書くときに「これは引数名省略した方が便利かな?わかりにくいかな?」と考えてから、
定義をしていくようにしましょう。
練習問題(制限時間7分)
(1)円の面積を求めるための関数「areaOfCircle」を定義してください。その際、2つの引数名「radius」「pi」の型を小数点に対応させてください。その際、外部引数名を「_」にしてください。
(2)関数「areaOfCircle」を呼び出し、radiusとpiにそれぞれ「2.0」「3.14」の引数を渡して、その処理結果を定数「total」で表示してください。
他にも、乱数を出す「arc4random_uniform」、小数点以下を四捨五入する「round」、累乗の計算をする「pow」などは、
引数名を付けずに値を渡すだけで利用できます。
また、例えばlesson10「乗り換え案内のアプリ」のサーチバーの文法などに「_」が登場しますので、
復習を兼ねて読み返してみるのも良いですね。
関数や引数は、文法の中でも難しい部分です。
答えをみないでもコードが書けるよう、繰り返し練習してみましょう。