遅延評価の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 processedlazyと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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- lazyプロパティ
- 遅延評価のmapとfilter
- 遅延評価と即時評価のトレードオフ
- カスタム遅延シーケンスの構築