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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- associatedtypeとジェネリックプロトコル
- 型消去パターン(AnySequence/AnyIterator)
- existential(any P)とジェネリックの使い分け