しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftで配列内の数字の合計を出すreduceを試してみた

SwiftのArrayのreduceというメソッドが便利だったので詳しく調べてみました。

Intの配列の合計を足す方法は下の通りです。
reduceの第一引数に初期値を入れて第2引数には各要素に対して行う処理を記述します。
今回は全ての数字を足したかったので$0 + $1と書きました。

print([1, 2, 3].reduce(0, combine: { $0 + $1 })) // → 6

余談ですが、Swiftのブロック引数を外出しできる性質や+が関数という事を利用すると下のようにも書けます。

print([1, 2, 3].reduce(0, combine: +))
print([1, 2, 3].reduce(0) { $0 + $1 })

+でなく-にすると-6になります。

print([1, 2, 3].reduce(0, combine: { $0 - $1 })) // → -6

reduceは演算だけでなく下のように加工した配列を返すことにも使えます(この例だとmapを使った方が良さそうですが)

print([1, 2, 3].reduce([Int](), combine: { (var origin, element) -> [Int] in
    origin.append(element * 2)
    return origin
})) // → [2, 4, 6]

実用的な使い方として、オブジェクトのプロパティーを足す事もできます。

struct MyStruct {
   var value: Int
}

let array = [MyStruct(value: 1), MyStruct(value: 2), MyStruct(value: 3)]
let result = array.reduce(0, combine: { $0 + $1.value })
print(result) // → 6