some、any、ジェネリクスの使い分け
同種の静的型付けには ジェネリクス 、固定された具体型を隠すには some P 、異種のポリモーフィズムには any P を選びます。
「some、any、ジェネリクスの使い分け」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。
どれをいつ使うか
目安:
- ジェネリクス: 呼び出しごとに同じ具体的な型を扱います。コンパイル時のチェックとパフォーマンスに最適です。
- some P: 具体的な戻り値の型を隠しますが、関数ごとに型は固定されます。
- any P: 準拠する型を混在させられます(異種)。動的ディスパッチを使います。
ジェネリクス: 同種のデータ
ジェネリクスは、同種のデータや最適化(静的ディスパッチ、インライン化)に適しています。
protocol Shape { func area() -> Double }
struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }
// Generic: one concrete Shape type per call site (homogeneous)
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double where S.Element == T {
xs.reduce(0) { $0 + $1.area() }
}
print(totalAreaGeneric([Circle(r:1), Circle(r:2)])) // OK
// totalAreaGeneric([Circle(r:1), Square(s:2)]) // ❌ different types不透明な型: 隠すが固定
some Pは、固定されているものの隠された型を返します。静的なパフォーマンスを損なわずにカプセル化したい場合に適しています。
// Opaque factory hides the concrete type while guaranteeing Shape
func unitShape(flag: Bool) -> some Shape {
// Must return the SAME underlying type on all paths; pick one.
Circle(r: 1)
}
let s = unitShape(flag: true)
print(String(format: "%.2f", s.area())) // 3.14any P: 異種の型
any Pを使うと、1つのコレクションや変数に異なる型を混在させられます。メソッドはプロトコルのインターフェースを介して動的にディスパッチされます。
// Existential: store mixed conformers
let mixed: [any Shape] = [Circle(r: 1), Square(s: 2)]
let sum = mixed.reduce(0) { $0 + $1.area() } // dynamic dispatch
print(String(format: "%.2f", sum))APIの形を比較する
公開するインターフェースを選択してください:
- ジェネリック: 呼び出し側が具体的な型を制御します。
- 不透明: 型を隠しますが、関数ごとに固定されます。
- 存在型: 具体的な型を実行時に変えられます。
// Three API shapes for the same idea: "make a Shape"
// 1) Generic return — exposes concrete type to caller
func makeGeneric<T: Shape>(_ t: T) -> T { t }
// 2) Opaque return — hides concrete type but fixed
func makeOpaqueCircle() -> some Shape { Circle(r: 1) }
// 3) Existential return — can return any conformer
func makeExistential(_ big: Bool) -> any Shape { big ? Square(s: 3) : Circle(r: 1) }
let g: Circle = makeGeneric(Circle(r: 2)) // caller knows concrete type
let o = makeOpaqueCircle() // caller sees only Shape
let e = makeExistential(true) // could be Circle or Square at runtime
print(g.area(), o.area(), e.area())チートシート
ガイドライン:
- データが同種の場合は、パフォーマンスと強い型付けのためにジェネリクスを優先してください。
- 戻り値の型を隠し、安定したAPIを維持するにはsome Pを使います。
- プラグインのような仕組みや異種コレクションにはany Pを使います。
- associated typeやSelfを持つプロトコルでは、型消去をしない限りany Pを避けてください。
判断問題: some/any/ジェネリクスを選ぶ
確認問題: プロトコルPの背後に、固定された具体的な戻り値の型を隠すのはどの選択肢ですか?
まとめ
まとめ:
- ジェネリクス = 同種で、最も高速かつ静的です。
- some P = 具体的な型を隠し、関数ごとに固定します。
- any P = 異種で、動的ディスパッチを使います。
よくある質問
「some、any、ジェネリクスの使い分け」レッスンは無料ですか?
はい。「some、any、ジェネリクスの使い分け」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。
「some、any、ジェネリクスの使い分け」で何を学びますか?
同種の静的型付けには ジェネリクス 、固定された具体型を隠すには some P 、異種のポリモーフィズムには any P を選びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「some、any、ジェネリクスの使い分け」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- some P(不透明な結果型):具象型を隠す
- any P(存在型):トレードオフと動的ディスパッチ
- some、any、ジェネリクスの使い分け