1-7 高階関数と、コールバック関数
プログラミングにおいて重要な概念である、高階関数とコールバック関数についてお勉強してみましょう。
まずは、高階関数から
高階関数とは、他の関数を引数として受け取る関数か、または、関数を戻り値として返す関数のことを指します。
Swiftは、多くの高階関数を提供していて、map、filter、reduceなどがSwiftが提供する 高階関数 の例です。
高階関数とは、名前だけ聞くとギョウギョウしいですが、名前の意味を考えてみるとイメージがつきやすいと思います。
高階 : 「高い階層」といった意味
ここでの「高い階層」は、関数が他の関数を引数として受け取ったり、関数を戻り値として返したりすること を指します。
関数:プログラム内で特定のタスクを実行するもの
高階関数とは、つまり、
他の関数を引数として受け取るか、または関数を戻り値として返す関数のことを指します。
Swiftのmap、filter、reduceなどは高階関数の代表的な例であり、これらは他の関数を引数として受け取ります。
例えば、mapは、以下のような処理を書くことができますが、map関数は、{ }で囲われたクロージャを引数に持っています。
つまり、mapは、他の関数を引数として受け取る関数 = 高階関数 なのです。
let numbers = [1, 2, 3, 4, 5]
// mapは、"配列numbersの各要素を2倍にする関数"を 引数に持っている
let doubled = numbers.map({ (number: Int) -> Int in
return number * 2
})
print(doubled) // [2, 4, 6, 8, 10]
高階関数を定義する
是非、実際に操作しながら学んでいきましょう。
以下でSwiftのブラウザ実行環境が使えます。 print()で出力される文字を確認してみましょう。https://paiza.io/ja/projects/new
map、filter、reduceなどは、Swiftが提供している高階関数であって、
高階関数は、自分で定義することもできます。
// ⭐️ 引数として関数を受け取る高階関数
// ①:一つ目の引数は、Int
// ②:二つ目の引数は、"引数にIntを受け取りIntを返す関数"
// ①を引数に持たせて、②を実行する
func doMethod(value: Int, method: (Int) -> Int) -> Int {
return method(value)
}
// 引数に受け取ったIntに2を掛ける関数
func multiplyByTwo(value: Int) -> Int {
return value * 2
}
// multiplyByTwo 関数を引数として渡して、5を2倍にする
let result = doMethod(value: 5, method: multiplyByTwo)
print(result) // 10
この一連の処理では、doMethod関数が、第二引数に、multiplyByTwo関数を受け取っているので、
doMethod関数が、高階関数(他の関数を引数として受け取る関数)となります。
つづいて、コールバック関数とは
コールバック関数は、高階関数に引数として渡される関数のことを指します。
先ほど、高階関数の例で紹介した以下の処理は、multiplyByTwo が、コールバック関数です。
multiplyByTwo関数が、doMethod関数に渡されるコールバック関数 ということです。
// 引数として関数を受け取る関数
// ①:一つ目の引数は、Int
// ②:二つ目の引数は、"引数にIntを受け取りIntを返す関数"
// ①を引数に持たせて、②を実行する
func doMethod(value: Int, method: (Int) -> Int) -> Int {
return method(value)
}
// ⭐️ doMethod 関数の引数の渡される関数
func multiplyByTwo(value: Int) -> Int {
return value * 2
}
// multiplyByTwo 関数を引数として渡して、5を2倍にする
let result = doMethod(value: 5, method: multiplyByTwo)
print(result) // 10
まとめ
- 高階関数 は、他の関数を引数として受け取るか、または関数を戻り値として返す関数
- コールバック関数 は、他の関数の引数として渡される関数
- 高階関数と、コールバック関数は、Swiftだけの概念ではなく、多くのプログラミング言語で使用されている
ドリル
// 与えられた数値に10を足すコールバック関数
func addNumber(number: Int) -> Int {
return number + 10
}