0Pricing
Swift Academy · レッスン

associatedtypeとジェネリックプロトコル

associatedtype を使ったプロトコルを定義し、準拠する型がそれをどのように具体化するかを学び、プロトコル制約付きのジェネリック関数を使います。

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

なぜ関連型なのか

プロトコルはassociatedtypeによってジェネリックにできます。準拠する型が、そのプレースホルダーを具体的な型に結び付けます。

associatedtypeを持つプロトコル

associatedtype Itemは型パラメーターのように機能します。要件では、メソッド、サブスクリプト、プロパティでこれを使えます。

protocol Container {
    associatedtype Item
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(index: Int) -> Item { get }
}

具体的な準拠

準拠する型は、その型を使って要件を実装することで、具体的なItem(ここではInt)を選びます。

struct IntStack: Container {
    // Binds Item == Int implicitly by usage
    private var items: [Int] = []
    mutating func append(_ item: Int) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Int { items[index] }
}
var st = IntStack()
st.append(10); st.append(20)
print(st.count, st[1])

ジェネリックな準拠型

ジェネリック型はItem == Elementを結び付けることで準拠でき、プロトコルをジェネリックで再利用可能なままに保てます。

struct Stack<Element>: Container {
    private var items: [Element] = []
    mutating func append(_ item: Element) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Element { items[index] }
    // Here, associatedtype Item == Element
}
var s = Stack<String>()
s.append("hi"); s.append("bye")
print(s.count, s[1])

ジェネリクスでプロトコルを使う

C: Containerで関数に制約を付けます。具体的な型を固定せずに、抽象的にC.Itemを使えます。

// Generic algorithm operating on any Container
func dumpFirstTwo<C: Container>(_ c: C) {
    // We can talk about C.Item but not assume concrete type
    if c.count >= 2 {
        print("0:", c[0])
        print("1:", c[1])
    } else {
        print("too few elements")
    }
}
dumpFirstTwo(s)    // works with Stack<String>
dumpFirstTwo(st)   // works with IntStack

注意点とヒント

注意点:

  • 関連型を持つプロトコルは、型として直接使用できません。ジェネリクスまたは型消去を優先します。
  • プレースホルダーには明確な名前(Item、Element)を付けます。
  • 準拠は明示的に(typealias Item = ...)指定することも、シグネチャから推論させることもできます。

associatedtypeの意味

確認:associatedtypeは何を意味するのでしょうか。

まとめ

まとめ:associatedtypeを使ってプロトコルをジェネリックにします。準拠する型が具体的な型を選び、ジェネリック関数は制約を通じて任意の準拠型を扱えます。

よくある質問

「associatedtypeとジェネリックプロトコル」レッスンは無料ですか?

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

「associatedtypeとジェネリックプロトコル」で何を学びますか?

associatedtype を使ったプロトコルを定義し、準拠する型がそれをどのように具体化するかを学び、プロトコル制約付きのジェネリック関数を使います。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「associatedtypeとジェネリックプロトコル」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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