Reduce
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 25/56。
reduce は、配列全体を単一の値にまとめます。合計、乗算、極値の検索、または多くの要素から新しい文字列や配列を作成する場合に使用します。
let total = [1, 2, 3, 4].reduce(0) { acc, n in acc + n }
print(total) // 10第1引数は初期アキュムレータです。クロージャは、実行中のアキュムレータと次の要素を受け取り、新しいアキュムレータを返します。アキュムレータの最終的な値が結果となります。
算術演算子について、Swiftでは記号ベースの短縮形が用意されています:
[1, 2, 3, 4].reduce(0, +) // 10
[1, 2, 3, 4].reduce(1, *) // 24reduce は数値を返す必要はありません。アキュムレータはどのような型でもよく、自分で決めることができます:
let sentence = ["hi", "there"].reduce("") { $0 + $1 + "!" }
print(sentence) // "hi!there!"チャレンジ
簡単1行の入力を読み込みます。これはカンマ区切りの整数のリストです。それぞれに対して reduce を使用して、以下の3行を出力してください。
- 合計
- 積
- 最大値(2つの引数のうち大きい方を返すクロージャを使用し、
.max()は呼び出さないでください)
少なくとも1つの要素があると仮定します。最大値については、nums[0] を初期アキュムレータとして使用し、配列の残りの部分を reduce することができます。
入力が 3,7,2,8,4 の場合、出力は以下のようになります:
24
1344
8チートシート
reduce は、初期アキュムレータとクロージャを使用して、配列を単一の値にまとめます:
let total = [1, 2, 3, 4].reduce(0) { acc, n in acc + n } // 10算術演算子の短縮形:
[1, 2, 3, 4].reduce(0, +) // 10
[1, 2, 3, 4].reduce(1, *) // 24アキュムレータは任意の型にすることができます:
["hi", "there"].reduce("") { $0 + $1 + "!" } // "hi!there!"reduce を使用して最大値を見つけるには、最初の要素を初期値として使用します:
let maxVal = nums.dropFirst().reduce(nums[0]) { $0 > $1 ? $0 : $1 }自分で試してみよう
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: reduceを使用して合計、積、最大値を求める
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。