Swiftのクロージャ(Closures)

クロージャ

クロージャ(Closures)です。クロージャは、一言で表すなら「関数の一般化」か「関数の略式表現」のようなものです。後で簡単に触れますが、関数(functions)はクロージャの特殊な形態の1つです。「関数はクロージャである」と言っても良いかもしれません。

Swiftでは、関数型(function types)が様々な場所で使われています。これを利用する際に、いちいち関数を定義して渡していると、プログラムが煩雑になったり可読性が悪くなります。クロージャは、そのような場合に、簡潔な表現で全く同じ機能を実装できる非常に便利な構文になっています。

ここでは、クロージャとは何か?ということから始めて、クロージャ表現構文について詳しく紹介した後、後置クロージャ(Trailing Closures)について、さらに値のキャプチャ、クロージャは参照型である、という点について説明していきます。

クロージャ(Closures)って何?

クロージャ(Closures)とは何でしょうか?関数はすでに紹介しましたが、実は関数(グローバル関数、関数の入れ子)はクロージャの特殊なケースになっています。そういう意味では、クロージャは関数を一般化したようなものであると言えるかもしれません。

公式マニュアルにもあるように、クロージャは以下の3形態を取り得ます。

種類 英語表記 名前 キャプチャ
グローバル関数 Global functions あり なし
入れ子にした関数 Nested functions あり あり
クロージャ表現 Closure expressions なし あり

名前というのは、関数などに名前を付けられるかどうか、という意味です。キャプチャに関しては後で詳しく紹介します。グローバル関数(global functions)と入れ子にした関数(nested functions)については、関数のページで詳しく説明しましたが、確かに名前を付けることができました。

クロージャ表現というのは、次で詳しく説明します。クロージャ表現には名前が付かないですから、これは他のプログラミング言語で言う所のラムダ式とか無名関数に該当するようです。

Nonescaping ClosuresとAutoclosuresについては別記事で

Nonescaping closuresAutoclosuresは、クロージャ参照を制御したり、パラメータ受け取りの書き方を簡略化する機能です。これらは少し難しいですし、基本としては必要ではないと思ったので、別記事で紹介したいと思います。