🔖

swift クロージャー→関数の戻り値として返すクロージャー

2024/05/14に公開

今回は関数の戻り値として返すクロージャについて、
関数の戻り値がクロージャという感じがしますね

ソースを分解してみます

//クロージャを戻り値として返す関数
func makeGreeringCkisure() -> (String) -> Void {
  //クロージャを定義して戻り値として返す
  let greetingClosure: (String) -> Void = { name in 
  print("こんにちは\(name)さん")
  }
  //ここで
  return greetingClosure
  }
  //関数を呼び出してクロージャーを取得
  let greeting = makeGreetingClosure()

  //クロージャーを実行する
  greeting("John")

出力結果
こんにちは、Johnさん。

何をしているか

まずmakeGreeringCkisure(
)という関数を定義しています。
-> (String) -> Voidというクロージャの型を受け取る形を定義しています。※受け取るクロージャの型を定義している
↓
 let greetingClosure: (String) -> Void = { name in 
  print("こんにちは\(name)さん")
こちらは、greetingClosureという変数型のクロージャを定義しています、
引数としてStringを定義していて、受け取ったString型の引数をname引数に代入するという処理になっています。
↓
  greeting("John")
そしてこちらで、greetingクロージャに"John"というString型の値を渡しています、なので、nameにJohnというStringの値が代入されます。

出力結果がこんにちは、Johnさん。になるわけですね〜

さらに複雑にしてみます

func makeGreetingClosure() -> (String) -> Void {
  let greeetingClosure: (String) -> Void = { name in
    if name.count > 0 {
       print("こんにちは、\(name)さん。")
     } else {
      print("名前が指定されていません")
   }
}
 return greeetingClosure
}

let greet  = makeGreetingClouser()

//greetに
greet("John")
greet("")

出力
こんにちは、Johnさん。
名前が指定されていません

こちらも分解していきます

makeGreetingClosure関数を定義、クロージャー型はString
変数型のクロージャgreeetingClosureを定義 引数型はString
name引数を期待していて、渡されたStringの値、によって条件分岐をしています、Stringの文字列が0より多い場合は、渡されたname変数を代入した文字列が出力されます。
Stringの値が0より少ない場合は、名前が指定されていませんと出力される
 return greeetingClosureで戻り値として自身の変数名を定義しています。

let greet  = makeGreetingClouser()
で、makeGreetingClouser()関数をgreetととして定義、このgreet変数は、makeGreetingClouseで定義されたクロージャの機能を伝承し、使用することができます。

ということでgreetにStringの値を渡すことで、makeGreetingClouser関数の中のgreeetingClosureを実行し、戻り値を得ることができます。
greet("John")
greet("")

という感じで、関数の戻り値として返すクロージャーでした、
確かに関数の戻り値として、クロージャーの値が返ってきていますね〜

僕的に覚えておきたいことは、
クロージャーにも伝承のような機能があるそれが、関数の戻り値として返すクロージャーですねという感じです

let greet = makeGreetingClouser() ここら辺でgreetがmakeGreetingClouser関数のgreeetingClosureクロージャの戻り値を得られる形になっている。
難しいですが
let 変数 = クロージャーを持つ関数
という形が出てきたら 関数を持つクロージャーがどうやらあるという認識で行ってみます。

Discussion