🔖
swift クロージャー→関数の戻り値として返すクロージャー
今回は関数の戻り値として返すクロージャについて、
関数の戻り値がクロージャという感じがしますね
ソースを分解してみます
//クロージャを戻り値として返す関数
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