Swift 入門 | 関数リテラルとクロージャ | 関数リテラル

クロージャでは、関数を値として渡す。前の例のように、関数をあらかじめ定義して引数に指定できる。

ただし、単純な処理を 1 か所でしか使わない場合、別の関数を定義する必要はない。関数リテラルを使い、引数として関数を直接記述できる。

{ ... 処理 ... }

実際には、引数を含めて次のように書くことが多い。

{ 引数 in ... 処理 ... }

引数が複数ある場合はカンマで区切る。関数リテラルを使うと、必要な関数を事前に定義せず、その場で渡せる。

func printResult(function:(num:Int)->Int, n:Int) {
    print(function(num: n))
}

printResult({n in n * 2}, n: 10)

printResult({n in
    var re:Int = 0
    for num in 0...n {
        re += num
    }
    return re
}, n: 100)

この例では、前に定義した printResult 関数を呼び出している。別の calc 関数は使わず、呼び出し時に関数リテラルを直接渡している。

結果を 1 つの式で求められる場合は、関数リテラルを 1 行で書ける。複数行の処理は少し複雑になるが、考え方は同じである。

クロージャや関数リテラルは最初は難しく見えるかもしれない。関数を値として扱う仕組みだと理解し、例を変更しながら試してみよう。