スライドショー

【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

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。