1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

クロージャとは

Posted at

■クロージャ

クロージャとは、再利用可能なひとまとまりの処理です。
関数はクロージャの一種なので共通の部分がる。
関数ではfuncが必要だったり関数名がひつようだが
クロージャではオリジナルの書き方がある

へーーー
っでなんなのよこいつ!!!!!!

簡単に言うと
関数の中に関数を入れれる!ってのを短くかける
てきな感じ!

つまりどう言うこと?

まずはクロージャなしである関数を書いてみる!
あるbの関数をaの関数の中にいれたい

■Int型のデータ2つを足し算した値を返すメソッドがあるとする。

func a(n1:Int,n2:Int) ->  Int {
       return n1 + n2
}

a(n1: 2, n2: 3)  結果 5

■aメソッドの中身の足し算をかけ算にしたいとする。

引数で数字はカスタマイズできるけど
演算子は変えられへん。

つまり演算子変えたいだけやのにまた新しくメソッド作らあかん
長くなりそう…

func b(no1:Int, no2:Int) -> Int {

         return no1 * no2
}

b(no1:2,no2:3)  結果 6

できた!

このbのメソッドがやってる事はInt型2つを引数にしてreturnの結果を返り値Int型に持たせてる。

■bメソッドをaメソッドに入れ込みたいとする。

つまり関数の中に関数を入れたい!

bメソッドを引数に渡したいから
同じ式のデータ型を作る。

こんな感じ

dメソッドのやってる事をデータ型に

(Int,Int) -> Int

よしこれを入れ込もう!

■引数の3個目としてaメソッドに(Int,Int) -> Intを入れる。

func a(n1:Int, n2:Int, opelation:(Int,Int) ->Int ) -> Int {

//3個目の引数の中身をn1,n2がInt型やから入れ込んでreturnで返す。
     return opelation(n1,n2)
}

func b(no1:Int, no2:Int) -> Int {

         return no1 * no2
}

//3引数にdメソッドの関数名入れる。
a(n1:2, n2: 3, d)

結果   6

やりたいのはこれ!
これをクロージャ使ったら短くなる。

■クロージャの式

普通の関数をちょっと改造
消す物

func
関数名

■{を先頭に持ってきて代わりにinを記入

{ (引数名:データ型,引数名:データ型) -> Int in 
      return 返したい結果
}

■bメソッドをクロージャにすると

直接bメソッドクロージャをaメソッドに入れれるようになる。

//これがクロージャ前
func b(no1:Int, no2:Int) -> Int {

         return no1 * no2
}

//クロージャ後
 {(no1:Int, no2:Int) -> Int in
         return no1 * no2
}

■bメソッドクロージャをaメソッドに入れる。

結果は同じ6が返る

a(n1:2, n2:3 , operation:{(no1:Int, no2:Int) -> Int in
         return no1 * no2
})

結果 6

これをどんどん短くかける。

■短くしていこう型推論を使えばデータ型表示いらんくなる。

まずこちらのreturnをご覧ください
return opelationの中身はn1とn2です。
n1のデータ型はInt
n2もデータ型はInt型です。
returnで返してるデータ型が3っつめの引数と合致してるので
表示するまでもないでしょてきな感じ
ついでに3引数で返り値もIntって書いてるので省略できる。

func a(n1:Int, n2:Int, opelation:(Int,Int) ->Int ) -> Int {

     return opelation(n1,n2)
}

 //省略したクロージャを入れ込む
a(n1:2, n2:3 , operation:{(no1, no2) in
         return no1 * no2
})

■ついでにreturnも省略できる。

短いぞ!いい感じ!

a(n1:2, n2:3 , operation:{(no1, no2) in
   no1 * no2
})

■でももっともっと短くできる!!

(このパターンはあんまり使われないらしいです。短すぎて他の人見た時何してるか分かりづらいから)

クロージャの第一引数を ドル0とする
クロージャの第二引数を ドル1とする

a(n1:2, n2:3 , operation:{(no1, no2) in
   no1 * no2
})

//$0と$1を使うとめっちゃ省略できる

a(n1:2, n2:3 , operation:{$0 * $1})

//もはやoperationと言う引数名も省略パターン
a(n1:2, n2:3 ){$0 * $1})

省略しすぎて分かりづらいらしい。

■ちょうどいい省略はこんな感じらしい

//よく見かける感じかと
a(n1:2, n2:3 ){(no1, no2) in
   no1 * no2
}

■まとめ

これがクロージャ前

func a(n1:Int, n2:Int, opelation:(Int,Int) ->Int ) -> Int {

//3個目の引数の中身をn1,n2がInt型やから入れ込んでreturnで返す。
     return opelation(n1,n2)
}


func b(no1:Int, no2:Int) -> Int {

         return no1 * no2
}

a(n1:2, n2: 3, d)

結果  6

■これがクロージャ後

func a(n1:Int, n2:Int, opelation:(Int,Int) ->Int ) -> Int {
     return opelation(n1,n2)
}

a(n1:2, n2: 3){(no1, no2) in
    no1 * no2
}

結果  6

簡単に言うと
関数の中に関数を入れる時短くできるよーー!!!
これがクロージャ

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?