クロージャ

Swiftにおける**クロージャ(Closure)**とは、名前のない関数のようなもので、一連の処理を変数や定数として扱うことができる機能です。クロージャは、他の関数に引数として渡したり、戻り値として返したり、変数に代入して後で実行することができます。


1. クロージャの基本構文

swift
{ (引数) -> 戻り値の型 in 実行する処理 }

例:

swift
let greet = { (name: String) -> String in return "こんにちは、\(name)さん" } print(greet("山田")) // 出力: こんにちは、山田さん

2. 関数との違い

関数 クロージャ
funcキーワードで定義 { }ブロックで定義
名前を持つ 通常は無名(匿名)
再利用しやすい 一時的な処理に向いている

3. クロージャの省略記法(クロージャ式の簡略化)

Swiftでは、型推論引数名の省略により、クロージャをより簡潔に記述できます。

通常の形:

swift
let square = { (x: Int) -> Int in return x * x }

省略形:

swift
let square: (Int) -> Int = { $0 * $0 }
  • $0, $1 は、順に引数を表します。

  • 明示的なreturnも省略できます。


4. クロージャの使用例

配列のmap関数で使用:

swift
let numbers = [1, 2, 3] let squared = numbers.map { $0 * $0 } print(squared) // 出力: [1, 4, 9]

ソート時のクロージャ:

swift
let names = ["田中", "山田", "佐藤"] let sorted = names.sorted { $0 < $1 } print(sorted) // 出力: ["佐藤", "田中", "山田"]

5. クロージャのキャプチャ

クロージャは、**外部の変数や定数をキャプチャ(捕捉)**することができます。つまり、クロージャの外で定義された値を内部で保持し、使用できます。

例:

swift
func makeCounter() -> () -> Int { var count = 0 return { count += 1 return count } } let counter = makeCounter() print(counter()) // 出力: 1 print(counter()) // 出力: 2

このように、countは関数の外ではアクセスできませんが、クロージャ内に保持され、状態を維持します。


まとめ

  • クロージャは、無名関数のようなもの。

  • 関数と同様に引数・戻り値を持つことができる。

  • 簡潔な書き方が可能(省略記法)。

  • 変数のキャプチャにより、状態を保持できる。

  • 高階関数(map, filter, sortなど)と一緒に使われることが多い。

生成日:2025/05/04