0Pricing
Swift Academy · レッスン

reduceとreduce(into:)

コレクションを1つの値に集約します。

「reduceとreduce(into:)」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

reduceとは何ですか

reduceは、累積値と各要素を繰り返し組み合わせることで、シーケンス全体を1つの値にまとめます。

  • 開始値を指定します
  • また、(accumulator, element) -> accumulatorというクロージャを指定します

reduceで合計する

最も基本的な例として、すべての値を加算します。

let nums = [1, 2, 3, 4]
let total = nums.reduce(0) { acc, x in acc + x }
print(total)  // 10

演算子の省略記法

クロージャが単なる演算子の場合は、演算子の関数を直接渡せます。

let nums = [1, 2, 3, 4]
print(nums.reduce(0, +))   // 10
print(nums.reduce(1, *))   // 24

異なる型にreduceする

結果の型は要素の型と異なっていても構いません。

let words = ["a", "b", "c"]
let joined = words.reduce("") { $0 + $1.uppercased() }
print(joined)  // "ABC"

reduceで最大値を求める

合計以外の集計も計算できます。

let nums = [3, 9, 2, 7]
let maxVal = nums.reduce(Int.min) { max($0, $1) }
print(maxVal)  // 9

reduceのコスト

通常のreduceは、各ステップでまったく新しい累積値を作成します。StringやArrayのような値型では、要素ごとに累積値全体をコピーすることになるため、大きな入力ではO(n²)の処理量になります。

reduce(into:)の登場

reduce(into:)は累積値をinoutパラメーターとして渡すため、コピーする代わりにその場で変更できます。

let nums = [1, 2, 2, 3, 3, 3]
let counts = nums.reduce(into: [Int: Int]()) { dict, n in
    dict[n, default: 0] += 1
}
print(counts)  // [1: 1, 2: 2, 3: 3]

効率的に配列を構築する

コレクションに値を累積する場合、reduce(into:)が力を発揮します。

let nums = [1, 2, 3, 4, 5]
let evensSquared = nums.reduce(into: [Int]()) { result, n in
    if n % 2 == 0 { result.append(n * n) }
}
print(evensSquared)  // [4, 16]

reduceとreduce(into:)の違い

結果は同じでも、パフォーマンス特性は異なります。

let parts = ["a", "b", "c"]
let a = parts.reduce("") { $0 + $1 }            // copies each step
let b = parts.reduce(into: "") { $0 += $1 }    // mutates in place
print(a, b)  // abc abc

reduce(into:)でグループ化する

よく使われるパターンとして、キーごとに項目をまとめます。

let names = ["Ann", "Al", "Bo", "Cy"]
let byInitial = names.reduce(into: [Character: [String]]()) { dict, name in
    dict[name.first!, default: []].append(name)
}
print(byInitial[Character("A")]!)  // ["Ann", "Al"]

使い分け

軽量なスカラー型の累積値(Int、Double)にはreduceを使います。累積値がコレクションなどの大きな値型の場合は、コピーを避けるためにreduce(into:)を使います。

let nums = [1, 2, 3]
print(nums.reduce(0, +))                          // scalar: plain reduce
print(nums.reduce(into: Set<Int>()) { $0.insert($1) }) // collection: into

理解度チェック

辞書や配列を構築するとき、なぜreduce(into:)を優先するのですか。

復習

値の集約について学びました。

  • reduce(initial) { acc, x in ... }はシーケンスを1つの値にまとめます
  • 演算子の省略記法:reduce(0, +)
  • reduce(into:)はinoutの累積値を変更するため、コレクションに使用します
  • カウント、グループ化、結合に適しています

次は、flatMapとチェーンです。

よくある質問

「reduceとreduce(into:)」レッスンは無料ですか?

はい。「reduceとreduce(into:)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「reduceとreduce(into:)」で何を学びますか?

コレクションを1つの値に集約します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「reduceとreduce(into:)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. mapとcompactMap
  2. filterと述語
  3. reduceとreduce(into:)
  4. flatMapとチェーン
← Swift Academyに戻る