【プログラミング初心者】Swift基礎~クロージャー~

はじめに

今回はクロージャーについて紹介します。

クロージャーも初心者には少し難しい内容かもしれませんがSwiftに限らず様々な言語で使われています。
ひとまず読める程度には理解しておきたいところです。

クロージャー(Closure)

クロージャーとは

クロージャーとは関数によく似た機能です。
一時的に使う名前のない関数というイメージです。

これだけだと何のことかわからないと思うので実装をみてみましょう。

クロージャーの実装

クロージャーの書き方は色々ありますが、今回は最も基本となる書き方で紹介します。

基本的な書き方は以下となります。

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

具体的な実装をします。

let testClosure = { (value: Int) -> Void in
    print(value)
}

testClosure(10)
testClosure(20)
testClosure(30)
10
20
30

このように関数として定義するのではなく、その場で一時的に使う処理で使います。

クロージャーの型

上記の例でクロージャーを変数に入れて実行しています。
変数に格納しているからには何かしらの型があります。

クロージャーの型は以下のように書けます。

(引数の型) -> 戻り値の型

上記のtestClosureは以下の様に書けます。

let testClosure: (Int) -> Void  = { (value: Int) -> Void in
    print(value)
}

コールバック

クロージャーの実装の仕方はわかったかと思いますが、ではいつ使うのかはイメージできないかと思います。

実際クロージャーはコールバックを実装するときによく使われます。

コールバックとは

コールバックとは、ある関数に処理を登録しておきその関数の中で登録した処理を呼び出す手法のことです。

例えばiOSの画面非表示のとき
dismiss(animated flag: Bool, completion: (() -> Void)? = nil)
というメソッドを使用します。
第二引数のcompletionにコールバック処理を登録しておくと、画面非表示が完了したとき登録した処理が実行されます。

コールバックを使うとこのように何かしらのイベント時の処理を呼び出す側で実装できるようになります。

デリゲートと用途は似ています。

コールバックの実装

具体的なコードを見ていきましょう。

func testFunction(callback: () -> Void) {
    print("Before")
    callback()
    print("After")
}

メソッドの引数にクロージャーを指定し、メソッドの処理の中でクロージャーの処理を実行しています。

呼び出し側は以下のように実装します。

testFunction(callback: { () -> Void in
    print("callback")
})

実行すると以下のような結果になります。

Before
callback
After

このように呼び出し側で実装した処理が実行されました。

もちろん引数と戻り値を与えることも可能です。

func testFunction(callback: (Int, Int) -> Int) {
    let num = callback(10, 15)
    print("結果:\(num)")
}

testFunction(callback: { (num1, num2) -> Int in
    return num1 + num2
})
結果:25

最後に

今回はクロージャー、コールバックについて紹介しました。
最初は慣れない考え方で理解が難しいかも知れませんが慣れてしまえば大した話ではありません。

Swiftでは特に配列操作周りでコールバックが使われています。
map、forEach、filterなど一度調べてみてください。

他にも通信部分などでもよく使われるので今のうちに基本は押さえておきたいところです。

今回の内容は以上です。

コメント

タイトルとURLをコピーしました