LESSON 21 ・ 関数
第一級関数
関数を変数に代入する
var a = abs(-2)
print(a)
前に絶対値を計算する関数absを使いました。
let a: (Int) -> Int = abs
let b = a(-2)
print(b)
Swiftでは、abs(-2)のように関数に値を渡して呼び出すだけでなく、absという関数そのものを変数に代入することができます。変数に代入された関数は( )で値を渡して呼び出すことができます。
ここでは関数absを変数aに代入し、a(-2)で呼び出しています。
(Int) -> Intは、「整数を一つ受け取り、整数を一つ返す関数」という関数の型です。absには複数の数値型に対応する形があるため、ここではどの型を使うか明示しています。
func square(_ x: Int) -> Int {
return x * x
}
let a = square
let b = a(3)
print(b)
自分で定義した関数も、同じように変数に代入できます。
このように、Swiftでは関数を数値や文字列と同じように値として扱えます。このような性質を持つ関数を第一級関数(だいいっきゅうかんすう, first-class function)と呼びます。
PRACTICE
演習問題
コードを自分で書いて実行してから、答えと解説を確認しましょう。
問題1
整数を2乗する関数squareを定義し、その関数自体を変数fに代入してください。f(5)の結果を表示してください。
答えと解説を見る
模範解答
func square(_ x: Int) -> Int {
return x * x
}
let f = square
print(f(5))
関数を呼び出す( )を付けずにsquareと書くと、関数そのものを変数へ代入できます。fからも同じ関数を呼び出せます。
問題2
絶対値を求める関数absを変数fに代入し、f(-8)の結果を表示してください。
答えと解説を見る
模範解答
let f: (Int) -> Int = abs
print(f(-8))
組み込みの関数も変数へ代入できます。変数fに-8を渡して呼び出すと、絶対値の8が返されます。
問題3
整数を2倍する関数doubleと、整数を1増やす関数addOneを定義してください。二つの関数を一つの配列にまとめ、それぞれに5を渡した結果を表示してください。
答えと解説を見る
模範解答
func double(_ x: Int) -> Int {
return x * 2
}
func addOne(_ x: Int) -> Int {
return x + 1
}
let functions: [(Int) -> Int] = [double, addOne]
print(functions[0](5))
print(functions[1](5))
関数は値として扱えるため、配列の要素にもできます。結果は10と6です。