RubyエンジニアのためのSwift入門(inject -> reduce編)

RubyエンジニアのためのSwift入門(inject -> reduce編)

みなさんこんにちは

元RubyエンジニアのiOSアプリエンジニアです。
普段、iOSアプリはSwiftで書いています。
最近、Rubyをどんどん忘れているのでとても不安です。

その昔、ARCがまだ出ていなかった頃に業務で幾つかアプリをリリースしたことがあり、その頃はまだSwiftがなかったのでObjective-Cを使ってました。
Swiftが出てからはObjective-Cで書く気になれないくらい気に入ってしまいました。

Swiftを書いていると、Rubyと似ているなと思うことが結構あるのですが、それらを紹介していきたいと思います。
今回は、Rubyでコードを短く書くときに便利な(と思っている)Enumerable#injectをテーマにします。

検証環境

  • Swift 3.0.2
  • Ruby 2.3.3p222

よく見かける例ですが、Rubyで配列の合計値を出したい場合、以下のように簡単に書くことができます。

irb(main):001:0* [1,2,3,4,5,6,7,8,9,10].inject(:+)
=> 55

これは、以下のようなコードを省略したものです。

irb(main):001:0> [1,2,3,4,5,6,7,8,9,10].inject { |sum, i| sum + i }
=> 55

injectはブロックに渡される1つ目の値に合計値が入ってきて2つ目の値に配列の値が入ってきます。
そしてブロックの戻り値が次のブロックのsumに渡されるので、上記のように実装すると、配列の値を累計した結果が得られます。

なんとRubyでは、injectの引数にシンボルを渡すとそのあたりをうまくやってくれるのです。(すばらしい)

SwiftではreduceというメソッドがArrayに用意されていて、Rubyのinjectと同じようなことができます。

[1,2,3,4,5,6,7,8,9,10].reduce(0,+)

これも省略した書き方で、以下のようなコードを省略したものです。

[1,2,3,4,5,6,7,8,9,10].reduce(0) { (sum, i) -> Int in
    sum + i
}

SwiftのReduceの場合、初期値を入れているところがRubyと違いますね。

ちなみにRubyでは、reduceというinjectのエイリアスメソッドがあります。

irb(main):001:0> [1,2,3,4,5,6,7,8,9,10].reduce(:+)
=> 55

Swiftって、本当にいい言語ですね。

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。