0Pricing
Swift Academy · レッスン

型消去パターン(AnySequence/AnyIterator)

AnySequence と AnyIterator を使って具体的なシーケンスやイテレーターの型を消去し、実装を公開せずに「Tのシーケンス」を返すAPIを構築します。

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

なぜ型消去なのか

型消去は、具体的な型を安定したラッパーの背後に隠します。AnySequenceやAnyIteratorを使うと、内部構造を公開せずに「要素のシーケンス」を返せます。

制限

Sequenceは関連型(Element)を持つため、プロトコルをそのまま具体的な値型として使うことはできません。ラッパーが必要です。

// Goal: return "some Sequence<Int>"
// This won't compile as a stored value type:
// let s: Sequence = [1,2,3]   // Protocol with associated types
// Instead, erase the type to AnySequence<Int>.

AnySequenceラッパー

AnySequenceは任意の具体的なシーケンス(Array、Set、カスタムのシーケンス)をラップし、AnySequence<Int>のような統一された型を公開します。

// Build an AnySequence<Int> from an Array
let a = [1, 2, 3]
let seq1: AnySequence<Int> = AnySequence(a)
// Consume like any sequence
for x in seq1 { print(x, terminator: " ") }
print("")

AnyIteratorラッパー

AnyIteratorは要素を生成するクロージャをラップします。これをAnySequenceで包むと、完全なシーケンスとして公開できます。

// Create an AnyIterator<Int> by hand
var i = 0
let it = AnyIterator<Int> {
    // Return next number or nil to stop
    guard i < 3 else { return nil }
    defer { i += 1 }
    return i
}
let seq2 = AnySequence(it)
for x in seq2 { print(x, terminator: " ") }  // 0 1 2
print("")

統一された戻り値の型

型消去を使うと、1つの関数で異なる実装を、単一の安定した戻り値の型(AnySequence<Int>)として返せます。

// Return a sequence of Int without exposing concrete type
func numbers(flag: Bool) -> AnySequence<Int> {
    if flag {
        // Array-based
        return AnySequence([10, 20, 30])
    } else {
        // Lazy generated with AnyIterator
        var n = 1
        let it = AnyIterator<Int> {
            guard n <= 3 else { return nil }
            defer { n += 1 }
            return n * 100
        }
        return AnySequence(it)
    }
}

for x in numbers(flag: true)  { print(x, terminator: " ") }  // 10 20 30
print("")
for x in numbers(flag: false) { print(x, terminator: " ") }  // 100 200 300
print("")

使用するタイミング

型消去を使うのは次の場合です:

  • シーケンスやイテレータの実装詳細を隠したい場合です。
  • 内部の分岐にかかわらず、APIが同じ型を返す必要がある場合です。
  • APIの境界にジェネリクスが公開されすぎる場合です。

注意点: モジュール内部ではパフォーマンスと明確さのためにジェネリクスを優先し、必要な場合は境界でAnySequence/AnyIteratorを使います。

AnySequenceの目的

理解度チェック: AnySequence<T>を使うと何ができるでしょうか?

まとめ

まとめ: 具体的なシーケンスやイテレータをAnySequence / AnyIteratorでラップして型を消去し、柔軟なAPIから「Tのシーケンス」を返します。

よくある質問

「型消去パターン(AnySequence/AnyIterator)」レッスンは無料ですか?

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

「型消去パターン(AnySequence/AnyIterator)」で何を学びますか?

AnySequence と AnyIterator を使って具体的なシーケンスやイテレーターの型を消去し、実装を公開せずに「Tのシーケンス」を返すAPIを構築します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「型消去パターン(AnySequence/AnyIterator)」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. associatedtypeとジェネリックプロトコル
  2. 型消去パターン(AnySequence/AnyIterator)
  3. existential(any P)とジェネリックの使い分け
← Swift Academyに戻る