0Pricing
Swift Academy · レッスン

カスタムイテレーターとパフォーマンスのヒント

カスタムイテレーターやシーケンスを実装し、単一パスの動作、余分なメモリ確保の回避、lazyビューの利用によって効率を保ちます。

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

カスタムイテレータ入門

独自のIteratorProtocolとSequenceを作成します。イテレータは通常1回限りの走査で、最後にnilを返す必要があります。

IteratorProtocolの例

next()を実装して、呼び出しごとに1つの要素を返し、状態を進めます。終了時にはnilを返します。

struct CountdownIterator: IteratorProtocol {
    var current: Int
    mutating func next() -> Int? {
        guard current >= 0 else { return nil }
        defer { current -= 1 }   // advance state
        return current
    }
}

var it = CountdownIterator(current: 3)
while let n = it.next() { print(n, terminator: " ") }  // 3 2 1 0
print("")

Sequenceラッパー

SequenceはmakeIterator()を提供します。これでfor-in、map、filterなどを使えるようになります。

struct Countdown: Sequence {
    let start: Int
    func makeIterator() -> CountdownIterator {
        CountdownIterator(current: start)
    }
}

for n in Countdown(start: 5) {
    print(n, terminator: " ")   // 5 4 3 2 1 0
}
print("")

AnyIteratorによる簡略化

AnyIterator/AnySequenceを使うと、クロージャでイテレータをすばやく作成できます。軽量なジェネレータに便利です。

// Build an iterator from a closure
var i = 1
let anyIt = AnyIterator<Int> {
    guard i <= 3 else { return nil }
    defer { i += 1 }
    return i * 10
}
let numbers = AnySequence(anyIt)
for x in numbers { print(x, terminator: " ") } // 10 20 30
print("")

処理を節約するlazy

パイプラインの一部だけが必要な場合は.lazyを優先します。割り当てと処理を節約できます。

let big = Array(1...10_000)
// Eager: builds two intermediate arrays
let eager = big.map { $0 * 2 }.filter { $0 % 3 == 0 }
// Lazy: no temporaries; work is done during collection
let lazyView = big.lazy.map { $0 * 2 }.filter { $0 % 3 == 0 }
let result = Array(lazyView.prefix(5)) // only first 5 actually computed
print(result)

パフォーマンスのヒント

ヒント:

  • イテレータはシンプルに保ち、状態を進めて最後にnilを返します。
  • 中間配列を避けるには.lazyを使います。
  • サイズがわかっている場合は、結果の容量をあらかじめ確保します(res.reserveCapacity(n))。
  • 複数回の走査やインデックスが必要な場合はCollectionのアルゴリズムを優先します。

イテレータのルール

理解度チェック: 反復の最後にnext()は何をしなければなりませんか?

まとめ

まとめ: 最小限のIteratorProtocolを作成してSequenceでラップし、可能な場合は.lazyと事前確保によってパイプラインを効率的に保ちます。

よくある質問

「カスタムイテレーターとパフォーマンスのヒント」レッスンは無料ですか?

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

「カスタムイテレーターとパフォーマンスのヒント」で何を学びますか?

カスタムイテレーターやシーケンスを実装し、単一パスの動作、余分なメモリ確保の回避、lazyビューの利用によって効率を保ちます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「カスタムイテレーターとパフォーマンスのヒント」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. SequenceとCollectionの階層
  2. Map/Filter/Reduceとlazyシーケンス
  3. カスタムイテレーターとパフォーマンスのヒント
← Swift Academyに戻る