【Swift入門】クロージャの使い方をわかりやすく解説!

Swiftでは関数によく似た処理としてクロージャ(Closures)があります。

この記事では、

・クロージャとは
・クロージャの基本的な使い方
・クロージャの型の宣言と引数の指定方法

というクラスの基本的な解説から、

・クロージャを引数に関数を実行する
・クロージャの最適な書き方とは(sorted)

などの応用的な使い方に関しても解説していきます。

今回はそんなクロージャ(Closures)の使い方についてわかりやすく解説します!

※この記事ではSwift3.1を使用しています。

クロージャとは

Swiftにはクロージャ(Closures)という関数とよく似た仕組みの機能があります。

クロージャについてWikiPediaで調べると、

    クロージャ(クロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数で実現している。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。

とあります。

まだいまいちピンとこない方もいるのではないでしょうか?

クロージャの機能をわかりやすく言うと、波カッコ{}ブロックで囲んだ中にある処理を実行する自己完結型の機能となります。

簡単に言えば関数のように名前を付ける必要がなく、指定した変数や引数に関数の処理を直接代入するような使い方をします。

クロージャの書き方:

 { (引数) -> 戻り値の型 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独特な機能なため、他の言語を経験している方にとっては関数のほうがわかりやすいと思うかもしれません。

見た感じどのような処理をしているのかわかりずらいクロージャよりは、関数を使ったほうが分かりやすい点もあります。

しかし、簡潔にまとまった処理を記述するには、省略形も使えるクロージャのほうがコード記述量が少なく済み、便利が場合もあります。

以下のサンプルでは、ソート処理「sorted(by:)」を元にクロージャで記述する例を紹介します。

サンプルプログラム

let fruits = ["Orange", "Apple", "Banana", "Melon", "PainApple"]  

func backward(s1: String, _ s2: String) -> Bool{  
    return s1 > s2
}

//ソート処理の実行
let fruits_sort = fruits.sorted(by: backward)

print(fruits_sort) 

実行結果:

["PainApple", "Orange", "Melon", "Banana", "Apple"]

sorted(by: )は配列の内容と同じ型の引数を2つクロージャで受け取り、Bool値を返して値がソートされると最初の値が第2引数の値の前後に現れるかどうかを返します。

取得したfruits_sortの配列を見てみると、アルファベットの大きい順に並べ替えられているのがわかりますね!

まとめ

ここではクロージャについて、

・クロージャとは
・クロージャの基本的な使い方
・クロージャの型の宣言と引数の指定方法
・クロージャを引数に関数を実行する
・クロージャの最適な書き方とは(sorted)

などについて解説しました。

クロージャは簡単にまとまった処理を記述するための関数のような処理で、意図した処理を明確、簡潔に書くために使用します。

もしクロージャの使い方を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

ヤマシタ

エンジニア歴10年のフリーランスエンジニア。ITに関わるさまざまなコンテンツの企画・制作も行っています。
ITに関してはノウハウ系、ライフハック系、トレンド系など、200本以上の執筆経験があります。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説