iOS
まとめ
Swift
クロージャ

クロージャを使いこなせるようになりたい

クロージャを自分で使いこなせない

closure.swift
func calculator(n1: Int, n2: Int, operation:(Int, Int) -> Int {
   return operation(n1, n2)
}

let result = calculator(n1: 2, n2: 3){$0 * $1}

いきなりですが、上のコードを見て「簡単だ。こんなの自分ですぐ書ける」と思えますか?思える人にとってはこの記事はあまり役に立つものではないので読まないでください。
僕には全く理解できませんでした。
ここから先は順番に、このコードがどのような状態からこのコードになったのか見ていってもらいます。

クロージャを使わないと

func.swift
func calculator(n1: Int, n2: Int) -> Int {
    return n1 * n2
}
calculator(n1: 2, n2: 3)

これで掛け算はできる

クロージャとは関数に引数として関数を渡すものである

a.swift
func calculator(n1: Int, n2: Int, operation:(Int, Int) -> Int {
   return operation(n1, n2)
}

func maltiple(no1: Int, no2: Int) -> Int {
   return no1 * no2
}
calculator(n1: 2, n2: 3, operation: multiple)

クロージャの作り方

func1.swift
func aaa(a: Int, b:Int) -> Int {
 return a + b
}

上の関数をクロージャにする手順をまとめて見ましょう
1. funcと関数名を削除

func1.swift
(a: Int, b:Int) -> Int {
 return a + b
}

2.{を前に持ってくる

func.swift
{ (a: Int, b:Int) -> Int
 return a + b
}

3.inをくっつける

func.swift
{ (a: Int, b:Int) -> Int in
 return a + b
}

さあクロージャを使おう!

a.swiftのmaltipleをクロージャで書くと

a.swift
{ (no1: Int, no2: Int) -> Int in
   return no1 * no2
}

これをoperationに渡せば良いので

a.swift
func calculator(n1: Int, n2: Int, operation:(Int, Int) -> Int {
   return operation(n1, n2)
}

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

もうわかったようなもんですね:heart_eyes:

省略できるところは省略しよう!

1.型推論が効くからIntを返す情報はいらない

a.swift
func calculator(n1: Int, n2: Int, operation:(Int, Int) -> Int {
   return operation(n1, n2)
}

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

2.return いらない

a.swift
func calculator(n1: Int, n2: Int, operation:(Int, Int) -> Int {
   return operation(n1, n2)
}

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

3.\$0 $1を使えば引数はいらない

a.swift
func calculator(n1: Int, n2: Int, operation:(Int, Int) -> Int {
   return operation(n1, n2)
}

calculator(n1: 2, n2: 3, operation: {$0 * $1})
  1. トレイリングクロージャを使う

トレーリングクロージャとは関数の最後の引数がクロージャの場合、クロージャを関数の外に書けるというもの

a.swift
func calculator(n1: Int, n2: Int, operation:(Int, Int) -> Int {
   return operation(n1, n2)
}

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

これでクロージャは完璧ですね!