Swiftでは関数によく似た処理としてクロージャ(Closures)があります。
この記事では、
・クロージャとは
・クロージャの基本的な使い方
・クロージャの型の宣言と引数の指定方法
というクラスの基本的な解説から、
・クロージャを引数に関数を実行する
・クロージャの最適な書き方とは(sorted)
などの応用的な使い方に関しても解説していきます。
今回はそんなクロージャ(Closures)の使い方についてわかりやすく解説します!
※この記事ではSwift3.1を使用しています。
クロージャとは
Swiftにはクロージャ(Closures)という関数とよく似た仕組みの機能があります。
クロージャについてWikiPediaで調べると、
とあります。
まだいまいちピンとこない方もいるのではないでしょうか?
クロージャの機能をわかりやすく言うと、波カッコ{}のブロックで囲んだ中にある処理を実行する自己完結型の機能となります。
簡単に言えば関数のように名前を付ける必要がなく、指定した変数や引数に関数の処理を直接代入するような使い方をします。
クロージャの書き方:
 { (引数) -> 戻り値の型 in
    処理
 }
クロージャの使い方
ここではクロージャの使い方について見ていきましょう。
基本的な使い方
引数と戻り値の無いクロージャは以下のように作成します。
サンプルプログラム1
//クロージャの処理
let cl = { () -> () in print("クロージャのテスト") }
//クロージャの実行
cl()
クロージャはコードを簡略化できるルールがあるため、引数や返り値が無いVoid型なら{ () -> () in ~}のように記述することが可能です。
また以下のようにVoidを記述したり、引数がないことが分かりきっている場合は (引数) -> 戻り値の型 in を省略することもできます。
サンプルプログラム2
//戻り値にVoidを指定
let cl_1 = { () -> Void in print("クロージャのテスト") }  
cl_1()
//引数と戻り値を省略
let cl_2 = { print("クロージャのテスト") }  
cl_2()
型の宣言と引数の指定
クロージャは関数と似た機能ですが、あらかじめ型を指定することもできます。
以下では引数にInt型、戻り値をVoidとしたクロージャを宣言しています。
var cl : ((Int, Int) -> Void)
クロージャの型宣言は必ずしも指定する必要はありません。
また、クロージャは宣言した型を元に引数を指定して、処理を実行できます。
以下に引数を指定して、クロージャ内で処理を実行するサンプルを紹介します。
引数あり、戻り値なし:
//引数あり、戻り値なし
var cl : ((Int, Int) -> Void)
cl = { (num1: Int, num2: Int) -> Void in 
  print(num1 + num2)
    
}
//クロージャの実行
cl(100, 200)
実行結果:
300
このように関数と同じように引数を指定して処理が実行できることがわかりますね!
以下ではクロージャに引数で渡した変数で演算した結果を戻り値で返すサンプルです。
引数、戻り値あり:
//引数、戻り値あり
var cl : ((Int, Int) -> Int)
cl = { (num1: Int, num2: Int) -> Int in 
  return num1 + num2
    
}
//クロージャの実行
print(cl(100, 200));
実行結果:
300
クロージャの応用的な使い方
クロージャを引数に関数を実行する
クロージャは、クロージャを引数として関数を実行することもできます。
以下ではInt型の変数2つとクロージャを引数にして関数を実行し、関数内でクロージャを実行するサンプルを紹介します。
サンプルプログラム
//関数
func sampleFunc(num1:Int, num2:Int, cl:(Int,Int) -> Int){
    print(cl(num1, num2))
}
//関数の実行
sampleFunc(num1:100, num2:200, cl:{(num1:Int, num2:Int) -> Int in num1 + num2})
実行結果:
300
クロージャの最適な書き方とは
クロージャはSwift独特な機能なため、他の言語を経験している方にとっては関数のほうがわかりやすいと思うかもしれません。
見た感じどのような処理をしているのかわかりずらいクロージャよりは、関数を使ったほうが分かりやすい点もあります。
しかし、簡潔にまとまった処理を記述するには、省略形も使えるクロージャのほうがコード記述量が少なく済み、便利が場合もあります。
以下のサンプルでは、クロージャでフルーツをアルファベットの大きい順に並べ替える記述を紹介します。
サンプルプログラム
let fruits = ["Orange", "Apple", "Banana", "Melon", "PainApple"]
let fruits_sort = fruits.sorted { $0 > $1 }
print(fruits_sort)
実行結果:
["PainApple", "Orange", "Melon", "Banana", "Apple"]
取得したfruits_sortの配列を見てみると、アルファベットの大きい順に並べ替えられているのがわかりますね!
まとめ
ここではクロージャについて、
・クロージャとは
・クロージャの基本的な使い方
・クロージャの型の宣言と引数の指定方法
・クロージャを引数に関数を実行する
・クロージャの最適な書き方とは(sorted)
などについて解説しました。
クロージャは簡単にまとまった処理を記述するための関数のような処理で、意図した処理を明確、簡潔に書くために使用します。
もしクロージャの使い方を忘れてしまったら、この記事を思い出してくださいね!
 
  






 
        