[Swift] 配列の合計などに使えるreduceの使い方

公開日: : iOSアプリ開発

UntitledImage

こんにちは、あきお(@akio0911)です。

今回はSwiftで配列の合計などに使えるreduceの使い方を説明します。

for … in … で合計を求める

まず、Intの配列の合計値を for … in … を使って愚直に求めてみましょう。

こんな感じですかね。やりたいことはできていますが、reduceを使うともうちょっとスッキリ書くことができます。

reduceで合計値を求めてみる

だいぶスッキリしました。とはいえ、なぜreduceを使うとこんなにスッキリ書けるのか最初は分からないと思うので順番に解説していきます。

reduceはパックマン的な処理を書ける

例え話で説明するとreduceはパックマン的な処理を書くための道具です。パックマンを知らない方向けに説明すると、パックマンは昔のゲームのキャラクターで口をパクパクと動かしながらドット・エサ・モンスターなどを食べていきます。

UntitledImage

図に表すとこんなイメージですね。パックマンは初期値を持っていて(上の図だと初期値は0)、パックマンは配列の要素を1つずつ食べていき、パックマンの現在値に食べた要素を足したものがパックマンの新たな値となります。

そしてパックマンが配列をすべての要素を食べ終わった後、パックマンの現在値は配列の合計値になるというわけです。

表にまとめると以下のようになります。左から順に「パックマンの現在値」「パックマンが食べた値」「新たなパックマンの値」「配列の残り要素」です。

UntitledImage

コードで表すと、赤枠で囲った部分が最初から順に
nums: パックマンに食べさせる配列
0: パックマンの初期値
acc: パックマンの現在値
num: パックマンが食べる値
となります。

UntitledImage

定数名などを日本語にしてコードを書くと以下のようになります。

日本語をやめてスッキリさせてみます。

reduceの2番目の引数に+を渡せる理由

Reduceの2番目に渡しているクロージャをいったん定数に代入してみます。Intを2つ受け取り、Intを1つ返しています。

ちなみに+はIntを2つ受け取ってIntを1つ返す関数であると言えます。

よって、以下のようにreduceの2番目に+を渡すことができるわけです。

reduceは柔軟性がある

ちなみにreduceに1と*を渡すと、配列の要素をすべて掛け合わせた結果を得ることができます。
初期値と要素を食わせた時の処理を指定できるのでreduceは柔軟性のある仕組みとなっています。

この記事を書いた人
あきお(@akio0911
派手髪iOSエンジニア。Twitterアカウントは@akio0911。YouTubeチャンネル「あきおチャンネル」にてiOSアプリ開発講座を公開中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。iOSアプリ開発をテーマとしたオンラインサロン「アプリ道場サロン」を運営。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。

関連記事

この記事が気に入ったら「いいね!」しよう

Twitterで更新情報をゲット!

PAGE TOP ↑