1-7 高階関数と、コールバック関数

プログラミングにおいて重要な概念である、高階関数コールバック関数についてお勉強してみましょう。

まずは、高階関数から

高階関数とは、他の関数を引数として受け取る関数か、または、関数を戻り値として返す関数のことを指します。

Swiftは、多くの高階関数を提供していて、mapfilterreduceなどがSwiftが提供する 高階関数 の例です。

高階関数とは、名前だけ聞くとギョウギョウしいですが、名前の意味を考えてみるとイメージがつきやすいと思います。

高階 : 「高い階層」といった意味
ここでの「高い階層」は、関数が他の関数を引数として受け取ったり、関数を戻り値として返したりすること を指します。

関数:プログラム内で特定のタスクを実行するもの

高階関数とは、つまり、
他の関数を引数として受け取るか、または関数を戻り値として返す関数のことを指します。

Swiftのmapfilterreduceなどは高階関数の代表的な例であり、これらは他の関数を引数として受け取ります

例えば、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

mapfilterreduceなどは、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
}