0Pricing
Swift Academy · レッスン

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.14

any 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フィードバックを取得できます。ローカル設定は不要です。

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

  1. some P(不透明な結果型):具象型を隠す
  2. any P(存在型):トレードオフと動的ディスパッチ
  3. some、any、ジェネリクスの使い分け
← Swift Academyに戻る