投稿日:Swiftのクロージャって何?いまひとつわからない、という方むけに、今回は、Swiftのクロージャについて以下の観点で丁寧に解説します。plusなお、一般的にクロージャ(関数閉包)とは、プログラミング言語における関数オブジェクトの一種で、引数以外の変数を、実行時の環境ではなく自身が定義された環境(静的スコープ)において解決することを特徴とする、と定義されています。「Swiftのクロージャの特徴」の箇所で説明しますが、Swiftのクロージャも、この一般的なクロージャの持つ特徴を備えており特別なものではありません。Swiftのクロージャとは何かSwiftのクロージャとは、コードで使用するために渡すことができる独立した機能ブロックです。object)ということです。(引数や戻り値としての)受け渡しといった、その言語における基本的な操作を制限なしに使用できる対象のことです。クロージャの形式には以下があります。グローバル(通常の)関数は、名前があり、値をキャプチャ(閉包)しないクロージャですネストされた関数は、名前があり、囲っている関数にある値をキャプチャ(閉包)できるクロージャですクロージャ式は、周りのコンテキストにある値をキャプチャ(閉包)できる、軽量シンタックスで記述された名前が無いクロージャですなので、関数はクロージャの特殊なケースということです。関数についてはSwiftの関数を参照してください。ネストされた関数についてはSwiftの関数のネストを参照してください。Swiftのクロージャ式ここでは、クロージャの形式の一つ、クロージャ式について解説します。クロージャ式は、名前も必要とせず関数のような構成をより短く記述できる、簡潔かつ明瞭なシンタックスでインラインに記述する手段です。クロージャ式のシンタックスは、次のような一般形式になります。パラメータを使用することができます。デフォルト値を持たせることはできません。可変長パラメータに名前を付けた場合には、可変長パラメータを使用することができます。パラメータの型および戻り値の型として、タプルを使用することもできます。メソッドがあるので、これを例にして見ていきましょう。関数のパラメータに関しては関数のパラメータを参照してください。}というクロージャ式を渡していることがわかります。このクロージャ式ですが以下の3つの観点から簡略化することができます。パラメータの型と返す値の型を推論することができます。型(関数型)の関数にする必要があります。型をクロージャ式の定義の一部として記述する必要はありません。パラメータ名を囲む丸括弧も省略することができます。その結果、以下のように記述することができます。)ここで、関数型とありますが、これについてはSwiftの関数型を参照してください。値が返されるということが明らかです。キーワードを省略することができます。その結果、以下のように記述することができます。名前でクロージャの引数の値を参照できる簡略引数名をインラインクロージャに与えます。クロージャ式で簡略引数名を使用する場合、定義からクロージャの引数リストを省略することができ、簡略引数名の数値と型は関数型から推論されます。キーワードも省略できます。その結果、以下のように記述することができます。)Swiftの後置クロージャ関数の最後の引数として関数にクロージャ式を渡す必要があって、かつクロージャ式が長い場合には、後置クロージャとして記述すると効果的です。後置クロージャは、サポートする関数呼び出しの丸括弧の外側(後ろ)に記述されるクロージャ式です。以下のような関数の場合を考えてみましょう。関数本体}通常のクロージャ式を渡して関数を呼び出す場合、以下のようになります。クロージャの本体})後置クロージャ式を渡して関数を呼び出す場合、以下のようになります。後置クロージャの本体}これを見ると、関数呼び出しの丸括弧の外側(後ろ)に{}を設けてクロージャの本体を記述していることがわかります。記述する必要はありません。その結果、以下のように記述することができます。map(_:)メソッドの例を見てみましょう。map(_:)メソッドでは、クロージャは配列内の項目ごとに一度呼び出され、その項目にマッピングした別の(型が異なることもある)値を返します。マッピングの性質と戻り値の型は、指定するクロージャに委ねられています。適切な文字列を調べるためにこの数値を使用します。Swiftのクロージャの特徴クロージャは、定義されているコンテキストにある定数や変数をキャプチャすることができます。クロージャは、定数や変数が定義されていた元のスコープにもはや存在しなくなっている場合でも、それらの定数や変数の値をクロージャの本体内から参照あるいは変更することができます。値をコンテキストからキャプチャします。