Swiftには配列の要素をまとめて計算したいときに便利な機能があります。
この記事では、
・reduceとは
・reduceの基本的な使い方
・reduceの中では何が行われているか?
というreduceの基本的な解説から、
・クロージャを引数に指定する方法
・型・return・引数を省略する方法
などの応用的な使い方に関しても解説していきます。
今回はそんなreduceの使い方についてわかりやすく解説します!
※この記事ではSwift4.0を使用しています。
reduceとは
reduceとは、配列の全要素の値を計算して合計を求めたいときなどに使用します。
reduceは以下のように記述します。
書き方:
配列名.reduce(初期値){$0 + $1}
reduceの引数には初期値を指定します。
$0は指定した初期値と$1を{}で計算した結果で、$1には配列の要素を順番に取り出した値が入ります。
他のプログラミング言語ではreduceのような処理はあまり見かけませんので、使い方のイメージが湧きにくいと思います。
次項ではreduceの使い方について詳しく解説していきます!
reduceの使い方
ここではサンプルを交えてreduceの使いかたを見ていきましょう。
基本的な使い方
reduceは前述したとおり、初期値で指定した値を元に配列の全ての要素を計算するときに使用します。
以下にreduceを使用して配列の合計を求めるサンプルを紹介します。
サンプルプログラム
//配列の定義 let array = [1, 2, 3, 4, 5] //reduceで配列の合計を求める let sum = array.reduce(0) {(num1: Int, num2: Int) -> Int in return num1 + num2 } print(sum)
実行結果:
15
上記のサンプルプログラムでは、まずreduceの引数に0を指定しています。
次に変数num1には初期値で指定した値とnum2で計算した結果が格納され、変数2には配列の要素が順番に格納されます。
合計を求める変数sumの値を出力すると、配列の全要素の合計値が取得されていることがわかりますね。
reduceの中では何が行われている?
ここまでの解説で、まだreduceの仕組みにピンと来ない方もいるのではないでしょうか?
reduceの処理は{}の中でfor文のように要素を1つずつ計算しているイメージになります。
先ほど紹介したサンプルプログラムを以下のようにすると、reduceの処理のイメージが掴みやすいと思います。
サンプルプログラム:
//配列の定義 let array = [1, 2 ,3, 4, 5] //reduceで配列の合計を求める let sum = array.reduce(0) {(num1: Int, num2: Int) -> Int in print("num1 : \(num1)") print("num2 : \(num2)") print("-*-*-*-*-*-*-*-*-") return num1 + num2 } print(sum)
実行結果:
num1 : 0 num2 : 1 -*-*-*-*-*-*-*-*- num1 : 1 num2 : 2 -*-*-*-*-*-*-*-*- num1 : 3 num2 : 3 -*-*-*-*-*-*-*-*- num1 : 6 num2 : 4 -*-*-*-*-*-*-*-*- num1 : 10 num2 : 5 -*-*-*-*-*-*-*-*- 15
上記のようにreduceの処理中で変数を出力してみると、処理ごとに値が加算されていることがわかりますね!
この処理をfor文で実行すると、以下のようになります。
サンプルプログラム:
var sum = 0 let array = [1, 2, 3, 4, 5] for value in array { sum += value } print(sum)
実行結果:
15
for文の場合では、最初にsumに0を代入する処理がreduce(0)となります。
for文の中ではreduceと同様に要素ごとに値が計算され、最終的に配列の要素分の合計を取得することができます。
for文については以下の記事で詳しく解説していますので、参考にしてください!
reduceのさまざまな使い方
ここではreduceのさまざまな使い方を見ていきましょう。
クロージャを引数を指定
配列の定義とreduceを同時に行い、reduceの引数にクロージャとして指定することも可能です。
reduceの引数にクロージャを指定:
let sum = [1, 2, 3, 4, 5] .reduce(0, {(num1: Int, num2: Int) -> Int in return num1 + num2}) print(sum) //15
クロージャについては以下の記事で詳しく解説していますので参考にしてください!
型・戻り値・引数の省略
reduceで指定する引数の型は省略することも可能です。
引数の省略:
let sum = [1, 2, 3, 4, 5] .reduce(0, {(num1, num2) -> Int in return num1 + num2}) print(sum) //15
returnを省略することも可能です。
returnの省略:
let sum = [1, 2, 3, 4, 5] .reduce(0, {(num1, num2) -> Int in num1 + num2}) print(sum) //15
まとめ
ここではreduceについて、
・reduceとは
・reduceの基本的な使い方
・reduceの中では何が行われているか?
・クロージャを引数に指定する方法
・型・return・引数を省略する方法
などについて解説しました。
reduceを使えば、配列の合計などの計算が簡単に行えますので、使い方についてはよく覚えておきましょう。
もし、reduceの使い方を忘れてしまったら、この記事を思い出してくださいね。