[Swift] 配列の合計などに使えるreduceの使い方
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
lolipop
こんにちは、あきお(@akio0911)です。
今回はSwiftで配列の合計などに使えるreduceの使い方を説明します。
for … in … で合計を求める
まず、Intの配列の合計値を for … in … を使って愚直に求めてみましょう。
こんな感じですかね。やりたいことはできていますが、reduceを使うともうちょっとスッキリ書くことができます。
reduceで合計値を求めてみる
だいぶスッキリしました。とはいえ、なぜreduceを使うとこんなにスッキリ書けるのか最初は分からないと思うので順番に解説していきます。
reduceはパックマン的な処理を書ける
例え話で説明するとreduceはパックマン的な処理を書くための道具です。パックマンを知らない方向けに説明すると、パックマンは昔のゲームのキャラクターで口をパクパクと動かしながらドット・エサ・モンスターなどを食べていきます。
図に表すとこんなイメージですね。パックマンは初期値を持っていて(上の図だと初期値は0)、パックマンは配列の要素を1つずつ食べていき、パックマンの現在値に食べた要素を足したものがパックマンの新たな値となります。
そしてパックマンが配列をすべての要素を食べ終わった後、パックマンの現在値は配列の合計値になるというわけです。
表にまとめると以下のようになります。左から順に「パックマンの現在値」「パックマンが食べた値」「新たなパックマンの値」「配列の残り要素」です。
コードで表すと、赤枠で囲った部分が最初から順に
nums: パックマンに食べさせる配列
0: パックマンの初期値
acc: パックマンの現在値
num: パックマンが食べる値
となります。
定数名などを日本語にしてコードを書くと以下のようになります。
日本語をやめてスッキリさせてみます。
reduceの2番目の引数に+を渡せる理由
Reduceの2番目に渡しているクロージャをいったん定数に代入してみます。Intを2つ受け取り、Intを1つ返しています。
ちなみに+はIntを2つ受け取ってIntを1つ返す関数であると言えます。
よって、以下のようにreduceの2番目に+を渡すことができるわけです。
reduceは柔軟性がある
ちなみにreduceに1と*を渡すと、配列の要素をすべて掛け合わせた結果を得ることができます。
初期値と要素を食わせた時の処理を指定できるのでreduceは柔軟性のある仕組みとなっています。
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!