カスタムイテレーターとパフォーマンスのヒント
カスタムイテレーターやシーケンスを実装し、単一パスの動作、余分なメモリ確保の回避、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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SequenceとCollectionの階層
- Map/Filter/Reduceとlazyシーケンス
- カスタムイテレーターとパフォーマンスのヒント