👽

【Swift UI】クロージャーによるコールバックを詳しく

2024/01/05に公開

クロージャーでコールバックする

クロージャー(Closure)とは

クロージャーについてざっくりと解説します。
簡潔に説明すると、名前を持たず定数や変数に代入できる関数です。

書き方

オーソドックスなクロージャーの書き方です。
{(引数: 型) -> 型 in }

下記は、引数にnameが入り「こんにちは、〇〇さん」と返すコードです。

関数の場合

func greet(name: String) -> String {
    return "こんにちは、\(name)さん"
}
let wordsOfGreeting = greet(name: "ore")
print(wordsOfGreeting) // こんにちは、oreさん

クロージャーの場合

let greet = {(name: String) -> String in 
    return "こんにちは、\(name)さん"
}
let wordsOfGreeting = greet(name: "ore")
print(wordsOfGreeting) // こんにちは、oreさん

メリットがよく分からないと思いますが、キャプチャなどのいい感じの機能があるので調べてください!
また、クロージャーの最大のメリットは

  1. 一度しか使わない処理を書くこと
  2. 関数の引数にも使えるということ ← これ今から解説する便利機能。

コールバックとは

一般的には、電話をかけ直すと言う意味です。

ITでは、関数に引数として渡される関数であるコールバック関数のことを指します。
先ほど、クロージャーは名前を持たない関数と説明した通り関数なのでコールバックとして使えます。

コールバック関数は、処理を呼び出し元に返します。

メリット

不要な変数や定数を書かなくて済む
可読性が上がる

クロージャーのコールバック

class Person {
    var name: String = "ore"
    var age: Int = 23
    
    func increaseAge(completion: (Int) -> Void) {
        age = age + 2
        completion(age)
    }
}

let me = Person()
me.increaseAge(completion: { result in
     print("result")
})

解説

increaseAge関数に引数として、completionと言う関数を入れている。completionはInt型が入りVoidを返す。Voidは何も返さないと言うこと

そして、increaseAge関数内でageに2を足してcompletionに入れている。

最後にPersonをインスタンス化してincreaseAge関数を呼んぶ。この場合だとresultの中にcompletion(age)でいれたageが入っている。
つまり、print結果は25になる。

Discussion