Closure (クロージャー)は、Haskellのラムダ式、JavaScriptの無名関数、Objective-Cのブロックと似た機能を持つ仕様です。
コーディングをしていて、一度しか使わないのに、わざわざ関数化するのに、抵抗がある場合や、ここに関数のような機能があればいいな、と思うことがあります。クロージャーはそのような時に使います。クロージャーは関数の一種です。クロージャーには名前をつける必要はありません。
クロージャーの基本形は、
{ (引数名: 引数の型) -> 戻り値の型 in
処理
}
と記述します。swiftインタープリターを起動して、次の例を試してみてください。
let a = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
a (5, 5)
R0: Int = 10
定数に設定されたクロージャーを呼び出す場合は、引数にラベル名をつけません。
let a = { () -> Int in return 100 }
a ()
R0: Int = 100
引数のないクロージャーを呼び出す場合も ( ) をつけます。
let a = { (num1: Int, num2: Int) -> Void in print(num1 + num2) }
a (100, 100)
200
戻り値がない場合は、Void の代わりに ( ) と記述することもできます。
let a = { (num1: Int, num2: Int) -> () in print(num1 - num2) }
a (200, 100)
100
let a = { () -> Void in print("Hello") }
a ( )
Hello
let a ={ () -> () in print("Bye") }
a ( )
Bye
クロージャーは引数と戻り値の値の型推論が効くため、次のように省略して記述することも可能です。
let a = { print("Hi")}
a ()
Hi
シンタックスシュガー (糖衣構文)は、複雑な書き方を、簡単でわかりやすく書くことができる方法です。
let a = { (num1: Int, num2: Int) -> Int in num1 * num2) }
print ( a (5, 5) )
25
let a ={ (num1: Int, num2: Int) in num1 * num2 }
print ( a (5, 10) )
50
続く