実際に書いてみる!Swiftのクロージャの使い方【初心者向け】

初心者向けにSwiftのクロージャの使い方を分かりやすく解説しています。様々なパターンを想定してクロージャの書き方を紹介しているので、実際に書きながら覚えてみてください。開発現場でも活きる知識になるはずです。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

初心者向けにSwiftのクロージャの使い方を解説していきます。

概念自体なかなか理解するのが難しいと感じる人も多くいますが、実際に書きながら理解していきましょう。

 

なお本記事は、TechAcademyのiPhoneアプリ開発オンラインブートキャンプの内容をもとに紹介しています。

 

クロージャとは

クロージャとは、一言で言うと名前がない関数のことです。

関数そのものを型に指定できたり、関数自体をインスタンス化できます。

変数や引数に関数の中身を直接代入できるため、グローバル変数の宣言をなるべく減らしたい場合や、関数の実行結果を次の処理で続けて使用する関数を作成したい場合に使用します。

 

クロージャの書き方

では、続いてクロージャの書き方を紹介します。

クロージャは以下の基本フォーマットのように関数名を付けず引数、処理、戻り値を定義します。

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

次に、このフォーマットに従って、Int型の引数を代入し、引数を使用した処理を実行し、その結果を返すというクロージャを以下に示します。

{(arg:Int) -> Int in
  arg += arg
  return arg
}

 

[PR] iPhoneアプリの開発で挫折しない学習方法を動画で公開中

実際に書いてみよう

では、次に色々なパターンのクロージャを書いていきましょう。

クロージャを引数にするパターン

以下のコードは、Int型の引数を2つとクロージャを引数に関数を呼び出し、関数の中でクロージャを実行するものです。

func calcPrice(a:Int, b:Int , total:(Int,Int) -> Int){
  print(total(a, b))
}
calcPrice(a:100, b:10, total:{(a:Int, b:Int) -> Int in return a * b})

実行結果

//  1,000

 

returnを省略するパターン

処理が1文しか無い場合は、returnを省略してクロージャを簡略化できます。

let add: (Int, Int) -> Int = {
  a, b in
  a + b
}
add(10, 10)

実行結果

//  20

 

引数名を短縮するパターン

引数名が重要でない場合、第1、第2引数をそれぞれ$0、$1とし、inを省略してクロージャを簡略化できます。

let add: (Int, Int) -> Int = { $0 + $1 }
add(10, 10)

実行結果

//  20

 

クロージャを関数の外で定義する場合

関数の引数の最後にクロージャがある場合、クロージャだけを外に出すことができます。

func add(a: Int, b: Int, closure: (Int, Int) -> Int) -> Int {
  return closure(a, b)
}
add(a:1, b:2) {
  $0 + $1
}

実行結果

//  3

 

値の保存を内部でするパターン

処理を実行して、値の保存を内部でしておきたい場合などに使います。
関数の中に関数を記述することで値の内部保存を実現できます。

func addNumber(number: Int) -> () -> Int {
  var sum = 0
  func add() -> Int {
    sum += number
    return sum
  }
  return add
}

実行結果

let total = addNumber(number:100)
total() // 100 
total() // 200

 

まとめ

クロージャは自由度が高く、様々なパターンの書き方があります。

そのため、初めてクロージャを使用する方にとっては、慣れるまで時間がかかるかもしれません。

いろんな書き方を自分で試して少しずつ慣れていきましょう。

 

また、TechAcademyでは初心者でも最短4週間でオリジナルアプリが作れるiPhoneアプリ開発オンラインブートキャンプを開催しています。期間中は現役エンジニアのメンターが毎日学習をサポートするので、独学よりも効率的に学ぶことができます。