■クロージャ
クロージャとは、再利用可能なひとまとまりの処理です。
関数はクロージャの一種なので共通の部分がる。
関数では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
簡単に言うと
関数の中に関数を入れる時短くできるよーー!!!
これがクロージャ