Blog

Swift クロージャーについて

Swiftのクロージャーについて説明します。

Swiftのクロージャは、関数と非常に似ている機能で、名称のない関数を定義するためのものです。クロージャは周囲のコンテキストから変数や定数を「キャプチャ」する能力があり、これがクロージャの最も特徴的な部分です。

クロージャの基本的な形

{ (引数) -> 戻値 in
    statements
}

クロージャの主な目的と使用例:

  1. 変数としての関数:
    クロージャは変数として渡すことができるので、関数やメソッドの引数として他の関数やクロージャを渡すことができます。
let add: (Int, Int) -> Int = { (a, b) in
    return a + b
}
print(add(2, 3))  // 5
  1. コールバックとしての使用:
    非同期操作の完了時に実行するコードブロックとしてクロージャを使用することがよくあります。
func fetchData(completion: (String) -> Void) {
    // データの取得処理
    completion("Data fetched!")
}

fetchData { (data) in
    print(data)  // Data fetched!
}
  1. 変数のキャプチャ:
    クロージャは定義された環境の変数や定数をキャプチャすることができます。
func makeIncrementer(incrementAmount: Int) -> () -> Int {
    var total = 0
    return {
        total += incrementAmount
        return total
    }
}

let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo())  // 2
print(incrementByTwo())  // 4

クロージャの特性:

  1. 省略記法:
    Swiftはクロージャの記法を簡略化するための様々な方法を提供しています。たとえば、型推論を使用してクロージャのパラメータや戻り値の型を省略できます。
  2. キャプチャリスト:
    クロージャの先頭にキャプチャリストを記述することで、クロージャのキャプチャ動作を制御することができます。これは循環参照を避けるために特に有用です。
  3. 逃避クロージャ (@escaping):
    関数の実行が完了した後も存在する必要があるクロージャには、@escaping属性を付けます。これは、非同期処理や保存して後で実行するクロージャでよく使用されます。

まとめ:

クロージャは、Swiftで非常に強力で柔軟なツールとして使用されます。変数のキャプチャ、コードの再利用、非同期処理のコールバックなど、さまざまな場面での利用が可能です。

ではいよいよFirebaseのAuth認証です。

ここでクロージャーを使っているコードをみて勉強しましょう!

Firebaseの場合,authとuserを渡して、userがnilだったら、ログインしていない状態ということになります。

 override func viewWillAppear(_ animated: Bool) {

//ここがクロージャー auth と userを渡しています。
        handle = Auth.auth().addStateDidChangeListener({ (auth, user) in

//ログインしているかどうか確認をして、auth, userの値が帰ってきます。その時に実行されるのがクロージャー
//帰ってきた値のuseがnilだったら
            if user == nil{

//Mainのストーリーボードを用意して
                let storyboard = UIStoryboard(name: "Main", bundle: nil)

//ログインViewControllerを用意して
                let loginVC = storyboard.instantiateViewController(withIdentifier: "LoginVC")
//ログインViewControllerを表示しなさい
                self.present(loginVC, animated: true)
            } else {

//そうでなかったらsetListenerを実行しなさい。(値監視の関数)
                self.setListener()
            }
        })
    }

WEBとつなげる時にどうしても通信が発生します。

通信にはどうしても、遅延が発生します。その時に、クロージャーのように、値が担保されているというのは、とてもありがたい仕組みですね。


一つ前の記事 マテリアルデザイン swift ライブラリ不使用で サルだとわからん!
次の記事 Swift UITextFieldがキーボードに隠れないようにする方法(ライブラリ使用)