Swift Academy · レッスン

lazyプロパティ

必要になるまで変換処理を遅延させます。

レッスン 1/413 ステップ

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

デフォルトでは即時評価

標準のコレクションメソッドは即時評価されます。mapやfilterなどはすぐに実行され、最初の要素しか読み取らない場合でも、直ちに新しい配列全体を構築します。

即時評価の処理はすぐに実行される

このコードは、変換後の配列全体を最初に構築します。

let nums = [1, 2, 3, 4, 5]
let doubled = nums.map { $0 * 2 }  // whole array built now
print(doubled.first!)  // 2

lazyプロパティ

すべてのコレクションには.lazyビューがあります。遅延ビューに対する操作は遅延実行され、実際に反復処理するか特定の要素を要求するまで実行されません。

遅延ビューを作成する

チェーンの先頭に.lazyを付けるだけです。

let nums = [1, 2, 3, 4, 5]
let view = nums.lazy.map { $0 * 2 }
// nothing computed yet
print(Array(view))  // [2, 4, 6, 8, 10]

遅延実行を確認する

副作用を使うと、クロージャが要求されたときだけ実行されることを確認できます。

let nums = [1, 2, 3]
let lazyMapped = nums.lazy.map { n -> Int in
    print("transforming \(n)")
    return n * 2
}
print("created view")
print(lazyMapped.first!)  // prints "transforming 1" then 2

lazyは異なる型を返す

遅延チェーンは軽量なラッパーであり、Arrayではありません。

let nums = [1, 2, 3]
let view = nums.lazy.map { $0 + 1 }
print(type(of: view).self != [Int].self)  // true -- it is a LazyMapSequence

遅延ビューを具体化する

保存または返却する必要がある場合は、Array(...)を使って具体的な配列に戻します。

let nums = [1, 2, 3]
let result: [Int] = Array(nums.lazy.map { $0 * 10 })
print(result)  // [10, 20, 30]

lazyとfirst(where:)

早い段階で処理を停止すると、遅延評価の効果が得られます。一致する要素を見つけるために必要な数の要素だけが処理されます。

let nums = [1, 2, 3, 4, 5, 6]
let firstBig = nums.lazy.map { $0 * $0 }.first { $0 > 10 }
print(firstBig!)  // 16  (stops at 4*4)

Rangeに対するlazy

Rangeもlazyと組み合わせられるため、大きなシーケンスやほぼ無限のシーケンスに便利です。

let firstThree = (1...1000).lazy.map { $0 * $0 }.prefix(3)
print(Array(firstThree))  // [1, 4, 9]

ビューが再評価されるタイミング

遅延ビューは反復するたびに再計算され、結果を保存しません。2回反復すると、変換も2回実行されます。

var calls = 0
let view = [1, 2].lazy.map { (n: Int) -> Int in calls += 1; return n }
_ = Array(view)
_ = Array(view)
print(calls)  // 4

lazyを使う場面

長いチェーンを構築していて、結果の一部(最初に一致した要素、先頭部分、または1回のreduce)だけを消費する場合は.lazyを追加します。小さな配列をすべて消費する場合は、即時評価のほうがシンプルです。

let nums = Array(1...100)
let result = nums.lazy.filter { $0 % 7 == 0 }.first
print(result!)  // 7

理解度チェック

.lazyプロパティによって、mapとfilterの何が変わりますか。

復習

遅延評価の基本を学びました。

  • 標準のコレクションメソッドは即時評価され、すぐに配列を構築します
  • .lazyは遅延実行されるビュー(特殊なシーケンス型)を返します
  • 処理は、反復するか要素を要求したときにだけ実行されます
  • Array(...)で具体化でき、ビューは反復するたびに再実行されます

次は、lazyなmapとfilterのチェーンです。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「lazyプロパティ」レッスンは無料ですか?

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

「lazyプロパティ」で何を学びますか?

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

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

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

「lazyプロパティ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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