実行環境
- Swift4
- Xcode9.2
クロージャとは
自分を囲むスコープにある変数を参照する関数のこと。
Swiftは第一級関数をもつ言語で、関数そのものを型に指定できたり、関数をインスタンス化できたりする。
関数に名前がない無名関数としても定義することができる。
使いどころ
変数や引数に関数の中身を直接代入できるため、グローバル変数の宣言をなるべく減らしたい場合や関数の実行結果を次の処理で続けて使用する関数を作成したい場合に使用する。
定義
{ (引数名:引数の型) -> 戻り値の型 in
処理
}
基本的な使い方
引数と戻り値のないクロージャ
// 引数と戻り値のないクロージャ
let closure = { () -> Void in print("クロージャテスト") }
// クロージャ実行
closure()
// 戻り値がVoidであれば、以下のようにも書ける
let closure = { () -> () in print("クロージャテスト") }
closure()
// クロージャーは引数と戻り値の型は推論が効くため、以下のような省略が可能
let closure = { print("クロージャテスト") }
closure()
引数あり、戻り値なしのクロージャ
// 引数あり、戻り値なしのクロージャ
let closure = { (num1: Int, num2: Int) -> Void in print(num1 + num2) }
closure(1, 2)
引数なし、戻り値ありのクロージャ
// 引数なし、戻り値ありのクロージャ
let closure = { () -> Int in return 100 }
closure()
引数あり、戻り値ありのクロージャ
// 引数あり、戻り値ありのクロージャ
let closure = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
closure(1, 2)
シンタックスシュガー
処理が単文の場合はreturnの省略が可
// 省略なしの場合
// let closure = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
let closure = { (num1: Int, num2: Int) -> Int in num1 + num2 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15
処理が単文の場合は戻り値の型の省略が可
// 省略なしの場合
// let closure = { (num1: Int, num2: Int) -> Int in return num1 + num2 }
let closure = { (num1: Int, num2: Int) in num1 + num2 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15
型が分かっている場合は省略が可
// 変数宣言
let closure: (Int, Int) -> Int
// 変数にクロージャを代入
closure = { (num1, num2) in num1 + num2 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15
引数名にこだわりがなければ引数名の省略が可
// 変数宣言
let closure: (Int, Int) -> Int
// 変数にクロージャを代入
// クロージャは自動的に名前が付けられる
// 第1引数は$0、第2引数は$1となる
// これを使用すると、引数の定義は不要であり、またinも不要となる
closure = { $0 + $1 }
// クロージャ実行
print(closure(5, 10)) // 結果: 15