0Pricing
Swift Academy · レッスン

遅延評価のmapとfilter

中間配列を作らずに遅延変換を連鎖させます。

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

中間配列

即時評価のチェーンでは、各ステップの間に新しい配列を割り当てます。大きな配列に対するfilter().map()では、数個の要素だけが必要な場合でも、完全な配列を2つ構築することになります。

即時評価による割り当て

ここでは2つの中間配列が作成されます。

let nums = Array(1...6)
let result = nums
    .filter { $0 % 2 == 0 }  // builds [2, 4, 6]
    .map { $0 * 10 }         // builds [20, 40, 60]
print(result)  // [20, 40, 60]

lazyでステップを融合する

遅延チェーンは操作を融合します。次の要素の処理を始める前に、各要素がすべてのステップを通過するため、中間配列が割り当てられることはありません。

遅延チェーン

同じロジックを、中間配列なしで実行します。

let nums = Array(1...6)
let result = nums.lazy
    .filter { $0 % 2 == 0 }
    .map { $0 * 10 }
print(Array(result))  // [20, 40, 60]

要素ごとの処理の流れ

ステージごとに実行するのではなく、処理が要素ごとに交互に進むことを追跡できます。

let out = [1, 2, 3].lazy
    .filter { n -> Bool in print("filter \(n)"); return n > 1 }
    .map   { n -> Int  in print("map \(n)");    return n }
print(Array(out))  // filter 1, filter 2, map 2, filter 3, map 3 -> [2, 3]

早期終了で処理を節約する

遅延チェーンをfirst(where:)と組み合わせ、可能になった時点ですぐに処理を停止します。

let nums = Array(1...1_000_000)
let hit = nums.lazy.map { $0 + 1 }.first { $0 > 5 }
print(hit!)  // 6  -- only a handful of elements processed

lazyとprefix

負荷の高い変換の結果から、先頭の数個だけを取得します。

let squares = (1...).lazy.map { $0 * $0 }
print(Array(squares.prefix(5)))  // [1, 4, 9, 16, 25]

省略された処理を数える

カウンターを使うと、実際に処理された要素が少数であることを確認できます。

var transforms = 0
let result = Array(1...100).lazy
    .map { (n: Int) -> Int in transforms += 1; return n * 2 }
    .prefix(3)
_ = Array(result)
print(transforms)  // 3, not 100

遅延compactMap

compactMapにも遅延形式があります。

let raw = ["1", "x", "3", "y", "5"]
let first = raw.lazy.compactMap { Int($0) }.first
print(first!)  // 1

複数のステップを組み合わせる

長い融合パイプラインも、具体化するまではメモリを割り当てずに維持されます。

let r = Array(1...20).lazy
    .filter { $0 % 2 == 0 }
    .map { $0 * $0 }
    .filter { $0 > 50 }
print(Array(r))  // [64, 100, 144, 196, 256, 324, 400]

融合が最も効果を発揮する場面

遅延評価による融合は、元のデータが大きく、結果の一部だけを残す場合に効果的です。最終的にすべてを配列に取り込む場合は節約効果が小さくなり、即時評価のほうが読みやすいこともあります。

let big = Array(1...10_000)
let sample = Array(big.lazy.filter { $0 % 1000 == 0 })
print(sample)  // [1000, 2000, ... 10000]

理解度チェック

遅延評価のfilter().map()チェーンは、即時評価のチェーンが作成する何を避けられますか。

復習

遅延チェーンについて学びました。

  • 即時評価のチェーンでは、各ステップの間に配列が割り当てられます
  • .lazyはステップを融合し、要素ごとに処理するため中間配列を作りません
  • first(where:)やprefixと組み合わせると、早期終了を効果的に利用できます
  • 元のデータが大きく、結果の一部だけを消費する場合に最も効果があります

次は、lazyとeagerのトレードオフです。

よくある質問

「遅延評価のmapとfilter」レッスンは無料ですか?

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

「遅延評価のmapとfilter」で何を学びますか?

中間配列を作らずに遅延変換を連鎖させます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「遅延評価のmapとfilter」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. lazyプロパティ
  2. 遅延評価のmapとfilter
  3. 遅延評価と即時評価のトレードオフ
  4. カスタム遅延シーケンスの構築
← Swift Academyに戻る