Swift : クロージャーって何?

1 min読了の目安(約1400字TECH技術記事

クロージャーとは

  • 一言でいうと名前がない関数
  • 宣言したスコープ内でしか使えない関数

何が出来るの?

  • 関数そのものを型に指定できる
  • 関数自体をインスタンス化できる
  • 変数や引数に関数の戻り値を直接に代入できる

こんな時に使います

  • ローバル変数の宣言をなるべく減らしたい場合
  • 関数の実行結果を次の処理で続けて使用する関数を作成したい場合

基本フォーマット

関数名はないので、引数と戻り値、in の後に処理を記述。引数や戻り値がない場合も可能。

 { (引数名:引数の型) -> 戻り値の型 in
    処理
 }

書いてみよう

クロージャーには色々書き方がありますので、思いつく限り書いてみました。

引数と戻り値がないパターン

// 定義:引数と戻り値がないパターン その1
let closure = { () -> Void in }

// 定義:引数と戻り値がないパターン その2
let closure2: () -> Void = {}

引数あり・戻り値がないパターン

// 定義:引数あり・戻り値がないパターン
let closure = { (a: Int) -> Void in }

引数なし・戻り値があるパターン

// 定義:引数なし・戻り値があるパターン
let closure = { () -> Int in
    return 1
}

// 実行
let val = closure()
print( val ) // 1

引数あり・戻り値があるパターン

// 定義:引数あり・戻り値があるパターン
let closure = { (a: Int) -> Int in
    return a + 2
}

// 実行
let val = closure(4)
print( val ) // 6

returnを省略したパターン

// 定義:returnを省略したパターン
let closure = { (a: Int) -> Int in a + 3 }

// 実行
let val = closure(5)
print( val ) // 8

戻り値の型を省略したパターン

// 定義:戻り値の型を省略したパターン
let closure = { (a: Int) in a + 3 }

// 実行
let val = closure(4)
print( val ) // 7

引数の型を省略したパターン

// 定義:引数の型を省略したパターン
let closure = { a in a + 6 }

// 実行
let val = closure(4)
print( val ) // 10

定義と処理を別々に実装したパターン

// 定義
let closure: ((Int, Int) -> Int)

// 処理
closure = { a, b in
    return a + b + 1
}

// 実行
let val: Int = closure3(2, 3)
print(val) // 6