typealias + closure を使ってみる Swift3.0

まだ自分でもよく理解できていません。詳しい方教えてください。でも、もしかしたらtypealiasとclosureを使うと(特にこの記事ではtypealias)コードが簡潔っていうか読みやすくなるのかもしれない。

typealiasを使う

//関数でパラメータとしての閉包を宣言する
//タイプエイリアスでクロージャ構文タイプを定義します
typealias closure = (Int , Int) -> ()


//クロージャ構文を使用して関数を宣言します。
func myClosureFunction(action: closure) -> () {
    action(2,5)
}


//クロージャを呼び出して関数内でその値を取得します。 ブロック内でAとBの値を得ることができます。
myClosureFunction { (A, B) in
    print(A) //2
    print(B) //5
}

typealiasを定義してclosureという型を使えるようにします。closureは二つのInt型の引数を受け取り何も返しません。だから(Int , Int) -> (Void)でも良いです。

次、クロージャ構文を使用して関数を宣言します。actionという引数で先ほど宣言したtypealias closureを指定します。closure型の引数actionを受け取る関数です。closure型の引数actionは二つのInt型の引数を受け取り何も返さない型ですからaction(2,5)という風にすれば引数actionに二つのInt型の値が渡されます。

最後にクロージャを呼び出して関数内でその値を取得します。 ブロック内でAとBの値を得ることができます。余談ですがクロージャっていうのは即時関数だから、呼び出さなくても実行できるのかな?と思っていたけれど、結局呼び出さなければいけないらしいです。どうしてA, Bという引数名で値が取得できるのかは謎です。

typealiasを使わない


//クロージャ構文を使用して関数を宣言します。
func myClosureFunctionNoClosure(actionn: Int, actionnn: Int) -> () {
    print(actionn)
    print(actionnn)
}
myClosureFunctionNoClosure(actionn:2, actionnn:5)
//2
//5

上記のtypealiasを使う方のコードをtypealiasを使わないで書くとこんな感じになるんでしょうか。先ほど申し上げたように、どうしてtypealiasを使うとA,Bで受け取れるのか謎です。typealiasを使わない方だとA,Bじゃ受け取れません。この関数は、二つにIntを受け取る引数をとって何も返さない関数です。呼び出すときに引数に二つのIntを私て関数の中で引数の値を受け取ってprintします。クロージャ構文を使用してと書いてありますが、これって単純に関数じゃないかと思うような。。

 

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事