💭

swiftクロージャー→関数の引数として渡す形のクロージャ

2024/05/13に公開

初学者殺しのクロージャー
今回は「関数の引数として渡す形のクロージャ」です
何を言っているかよくわかりませんね、とりあえず例文で理解していきしょう。

//クロージャーを引数として受け取る関数
func performAction(action: () -> Void) {
  print("処理を開始します")
  action()
   print("処理が完了しました")
}

action {
  print("クロージャが実行されました")
}

出力結果
処理を開始します
クロージャが実行されました
処理が完了しました

performAction関数は、actionクロージャーを引数として受け取り、そのクロージャーを実行しています。
ややこしいので実行のタイミング(仮)とprint文を書きます
↓↓↓↓↓

performAction関数でactionクロージャーを引数として定義
↓ここでは"処理を開始します"と出力※ではないですが、そのようなニュアンス
action関数を実行
↓ここでは"クロージャが実行されました"と出力※ではないですが、そのようなニュアンス
performActionの引数にaction()を定義していたのでクロージャ(action())が実行される
↓print("処理が完了しました")と出力そのようなニュアンス

結果
処理を開始します
クロージャが実行されました
処理が完了しました
となる

少し複雑にしてみます

//クロージャを引数として受け取り実行する関数
//関数型のクロージャです
func performAction(actuon: (String) -> Void) {
   print("処理を開始します")
   action("John")
   print("処理が完了しました")
}
//今回関数に渡すクロージャ変数型のクロージャです
let greetPerson = {name:String) in
   print("こんにちは、\(name)さん。処理を開始します。")
}
performAction(action: greetPerson)
出力結果
処理を開始します
こんにちは、Johnさん。処理を開始します。
処理が完了しました

こちらは、performAction関数を呼び出し、その引数actionにgreetPersonというクロージャを渡しています。こちらもややこしいのでロープレします

performAction関数を定義し、引数名をactuon引数型をStringに、クロージャはaction("John")と定義しています。
↓
greetPerson という変数型のクロージャを定義しています。
nameというString型の引数を受け取る形になっています。
↓
performAction(action: greetPerson)
でperformAction関数を実行し、その際action引数にgreetPersonクロージャを渡しています。
そうすることによって、actionが実行される箇所でgreetPersonクロージャが実行されます
クロージャ実行の際は内部的に、actionが持つString"John"がgreetPersonに引数として渡される形で処理されます。

という感じです、難しいですね!!!!

とりあえず覚えておきたいのが(僕的に)
関数型の引数をとる関数やメソッドの宣言の部分で、その引数の型をクロージャ型に指定することで、関数を呼び出す際にクロージャを渡すことができる→そのクロージャは関数内で実行されるという感じ
performAction(actuon: (String) -> Void) こことか
let greetPerson = {name:String) in    こことか
のこと

Discussion