クロージャーとは
クロージャーは、関数を変数のように扱うことができる機能であり、関数を引数として渡すことや、関数から戻り値として返すことができます。
例文
クロージャーの基本的な構文
クロージャーの基本的な構文は以下のようになります。
{ (引数) -> 戻り値の型 in
// 処理内容
}
例えば、以下は、引数に整数を取り、2倍した値を返すクロージャーの例です。
let doubler = { (number: Int) -> Int in
return number * 2
}
クロージャーの使用例
クロージャーを使用する例として、以下は、配列に対してクロージャーを使い、要素を2倍した配列を作成する例です。
let numbers = [1, 2, 3, 4, 5]
let doubledNumbers = numbers.map({ (number: Int) -> Int in
return number * 2
})
print(doubledNumbers) // [2, 4, 6, 8, 10]
また、クロージャーを引数として渡す例として、以下は、引数としてクロージャーを受け取り、そのクロージャーを2回実行する関数を定義する例です。
func runTwice(_ closure: () -> ()) {
closure()
closure()
}
runTwice {
print("Hello")
}
// Hello
// Hello
キャプチャーとエスケープ
クロージャーは、変数を「キャプチャー」することができます。キャプチャーとは、クロージャーが作成された時点で存在していた変数を、そのクロージャー内で利用できるようにすることです。また、クロージャーを関数の引数として渡す場合、そのクロージャーが関数の実行が終了した後も実行される可能性がある場合、「エスケープ」する必要があります。
var x = 10
let closure = {
print(x)
}
func foo(closure: () -> ()) {
closure()
}
foo(closure: closure) // 10
この例では、クロージャーが変数xをキャプチャーしており、関数fooでエスケープしています。そのため、関数fooの実行が終了した後も、クロージャーが実行される可能性があることに注意してください。