【Swift】クロージャ(closure)って何?

クロージャは再利用可能なまとまった処理のことを表します。

同じようなものに関数というものがありますが、関数とは違い、関数名(func 〜)がなかったり、色々省略できるものがあったりと関数よりも手軽に使えるのが特徴です。

クロージャの書き方

クロージャは関数と同じように「{   }」で囲み、次のように定義します。

{ (引数:引数の型) -> 戻り値の型 in 
    // 処理
}

上記のフォーマットにしたがって、値を半分にするクロージャーを書くと次のようになります。

let half = { (x: Float) -> Float in
   return x /2
}

half(10)  // 結果:5.0

ちなみに、上記の例のようにクロージャ内の文が1つの時は「return」を省略して書くこともできます。



型の省略

先ほどのフォーマットにしたがって、「引数」や「戻り値」がない場合は次のように書くことができます。

let showMessage= { () -> Void in
   print ("Hello World!")
}

showMessage()  // Hello World

ですが、戻り値がない場合は、「Void」の代わりに「()」で置き換えることが可能なので、次のように書くこともできます。

let showMessage= { () -> () in
   print ("Hello World!")
}

showMessage()  // Hello World

さらに、クロージャの引数と戻り値には型推論が働くので、上記の処理はさらに次のようにすっきりとさせることができます。

let showMessage= { print ("Hello World!") }

showMessage()  // Hello World
型推論とは?

引数の値から、その値がInt型なのか、String型なのか、それとも他の型なのか、Swift側で自動で判断してくれる機能のことです。

Swift側で型が予測できる場合は、クロージャ内の型を省略することができます。

クロージャは関数内の引数に設定することも可能

//関数(2つの合計値を表示)
func showTotal(num1:Int, num2:Int, calc:(Int,Int) -> Int){
  print(calc(num1, num2))
}

//関数の呼び出し
showTotal(num1:40, num2:60, calc:{(x:Int, y:Int) -> Int in x + y})  // 結果::100

APIを使う場合、関数の引数にクロージャーを使うことが多いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA