Swift関数を返す関数もしかしてクロージャ?
最近クロージャについて勉強していたのですが、関数を戻り値として返せることがわかりました。第一級オブジェクトってやつですかね?
以下のコードがクロージャに当たるのかはわかりませんが覚えておくとすごい便利だと思います。
func helloFactory() -> (Int, String) -> () { func sayHello(count:Int = 10, words:String){ for _ in 0...count{ print(words) } } return sayHello } //英語挨拶 let english = helloFactory() english(3, "Hello") //日本語の挨拶 let japanese = helloFactory() japanese(10, "こんちわ")
まずhelloFactoriy()という関数を定義しています引数の値が(Int, String) -> ()
となっていますが、Swiftでは関数を戻り値として返す時には(引数の型)->(戻り値)
のように記述することができるそうです。
その次に、変数に対してhelloFactory関数を代入しています。
この時、変数の中にはhelloFactoryのreturnの値つまりsayHallo関数が入っています。なので、変数()と書いてやることで関数を実行することができます。今回は引数に数と文字列を入れるのでそれを入れてenglish(3, "Hello")
こんな感じにしているというわけです。