この記事は何?
Swiftプログラミングを理解する上で欠かせない Closure(クロージャ) について、キホンから勉強できます。
実行環境
Xcode10.2.1
Swift5.x
ハンズオン
実際にコードを書いて、確認します。
カンタンに言うと
クロージャを使うと、関数をオブジェクトとして扱えるようになります。
関数を 何かしらの目的を果たしてくれる機能 として捉えてみましょう。
そんな表現で、クロージャを使うと...
- 機能をオブジェクトに代入する
- 機能をパラメータとして関数に渡す
みたいなことができます。
普通の関数
こんな関数 sum(numbers:)
があったとします。
この関数は、整数の配列になっている各要素の合計値を計算してくれます。
func sum(numbers: [Int]) -> Int {
var total = 0
for number in numbers { total += number }
return total
}
パラメータとして [Int]
を受けて、Int
を返していることに注目しておきましょう。
これは、この関数の型 [Int]->Int
です。
実行すると...
sum(numbers: [1, 2, 3]) // 6
1 + 2 + 3 = 6
ですね。
クロージャ
同じ機能をクロージャで表現します。
let sumNumbers = { (numbers: [Int]) -> Int in
var total = 0
for number in numbers { total += number }
return total
}
クロージャを定数オブジェクト sumNumbers
に代入してる感じです。
{ 関数の型 in 実装 }
の部分がクロージャです。
関数の型だけに注目すると...
(numbers: [Int]) -> Int
となっています。
最初の関数 sum(numbers:)
と同じ型になっていますね。
機能をオブジェクトに代入する ことができました。
この定数オブジェクトの機能を実行するには...
sumNumbers([1, 2, 3]) // 6
と記述します。
結果は 1 + 2 + 3 = 6
ですね。
クロージャのパターン
この記事で扱ったクロージャは...
引数あり・返り値あり な機能でした。と言うことは、他にも...
- 引数なし・返り値ありなクロージャ
- 引数あり・返り値なしなクロージャ
- 引数なし・返り値なしなクロージャ
があるんでしょうね。