Swiftのクロージャは、関数と非常に似ている機能で、名称のない関数を定義するためのものです。クロージャは周囲のコンテキストから変数や定数を「キャプチャ」する能力があり、これがクロージャの最も特徴的な部分です。
{ (引数) -> 戻値 in
statements
}
let add: (Int, Int) -> Int = { (a, b) in
return a + b
}
print(add(2, 3)) // 5
func fetchData(completion: (String) -> Void) {
// データの取得処理
completion("Data fetched!")
}
fetchData { (data) in
print(data) // Data fetched!
}
func makeIncrementer(incrementAmount: Int) -> () -> Int {
var total = 0
return {
total += incrementAmount
return total
}
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 4
@escaping
):@escaping
属性を付けます。これは、非同期処理や保存して後で実行するクロージャでよく使用されます。クロージャは、Swiftで非常に強力で柔軟なツールとして使用されます。変数のキャプチャ、コードの再利用、非同期処理のコールバックなど、さまざまな場面での利用が可能です。
ここでクロージャーを使っているコードをみて勉強しましょう!
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とつなげる時にどうしても通信が発生します。
通信にはどうしても、遅延が発生します。その時に、クロージャーのように、値が担保されているというのは、とてもありがたい仕組みですね。