libro
www.tuyano.com
初心者のためのSwiftプログラミング入門

関数リテラルとクロージャ (4/4)

作成:2014-10-25 09:26
更新:2014-10-25 09:26

■関数リテラルを利用する

クロージャを利用するときには、関数を値として用意する必要があります。先ほどのサンプルのように関数をあらかじめ定義しておき、それを引数に指定してももちろんOKです。

が、そんなに複雑な処理でないならば、そしてその場で使うだけで他で利用することもないなら、わざわざ関数を定義して……というのはちょっと面倒ですね。

こうした場合、クロージャを使った関数を利用する際に、関数を引数として直接記述してしまうこともできます。これは、「関数リテラル」という形式で記述します。関数リテラルの書き方はとても単純です。
{ ……処理を書く…… }

これだけ。実は、Swiftでは、{}内に処理を記述したものはすべて関数として扱われるのです。ただし、これだと引数などの値が渡せないので、実際には以下のように書くことが多いでしょう。
{ 引数 in ……処理を書く…… }

引数が複数ある場合はカンマで区切って記述します。このように関数リテラルを使って関数の値を直接引数に記述すれば、あらかじめ必要な関数を定義しておくこともなくなります。

下にその利用例を挙げておきましょう。ここでは、前回のprintResultを用意し、それを呼び出す処理を書いてあります。見ればわかるように、calc関数はもうありません。その代りに、printResultを呼び出す際、関数リテラルで処理を直接記述しています。

関数リテラルでは、単純に1つの計算式だけで結果が得られるような場合は、1行にまとめて書けます。inの後に、ただ式を書くだけで済んでしまうのです。

複数行に渡る処理になるとそれなりに複雑な感じになりますが、1行だけの関数リテラルならシンプルで非常に使いやすいことがわかります。

クロージャと関数リテラルは、慣れないとなんだか難しそうに思えますが、「関数を値として扱うための仕組みだ」ということさえ押さえていればそう複雑なものではありません。実際に何度かサンプルを書いて動かしてみれば、すぐに使えるようになるはずですよ!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

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

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

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

※関連コンテンツ

「初心者のためのSwiftプログラミング入門」に戻る