Swift Academy · レッスン

some P(不透明な結果型):具象型を隠す

some P を返すと、具体的な戻り値の型を隠しながら P に準拠することを保証できます。呼び出し側は実装を公開せずに静的型付けの恩恵を得られます。

レッスン 1/38 ステップ

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

不透明な結果型を使う理由

不透明な結果型は、some Pを使って具体的な型をプロトコルの背後に隠します。具体的な型はその関数に対して固定されますが、呼び出し側から見えるのはプロトコルのインターフェースだけです。

  • 静的なパフォーマンスを損なわずにカプセル化できます
  • ファクトリやDSLのようなAPIに適しています

基本的な不透明ファクトリ

makeUnitCircle()はsome Shapeを返します。呼び出し側はarea()を呼び出せますが、具体的な型に依存することはできません。

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 }
}

// Opaque factory: callers know it's a Shape, not which one
func makeUnitCircle() -> some Shape {
    Circle(r: 1.0)    // concrete type is hidden
}

let sh = makeUnitCircle()
print(String(format: "%.2f", sh.area()))  // 3.14

関数ごとに固定

隠された型は関数ごとに固定されます。some Shapeを返す別の関数では、異なる具体的な型が隠されている可能性があります。

// Each function using "some Shape" chooses one hidden concrete type.
// Within the same function, it must always be the same concrete type.
func makeSquare(side: Double) -> some Shape {
    Square(s: side)   // fixed to Square for this function
}

let a = makeUnitCircle()
let b = makeUnitCircle()
print(a.area() == b.area())  // true for two unit circles

let q = makeSquare(side: 2)
print(q.area())              // 4.0

隠される型は1つだけ

ルール: 不透明な戻り値を持つ関数は、すべての経路で同じ具体的な型を返す必要があります。分岐ごとに異なる型を返すと、コンパイルエラーになります。

// ❌ This would NOT compile, because different branches return different concrete types:
// func makeShape(flag: Bool) -> some Shape {
//     if flag {
//         return Circle(r: 1)
//     } else {
//         return Square(s: 1) // error: underlying type must be the same
//     }
// }
// Rule: an opaque-returning function must always produce the same concrete type.

ジェネリクスと不透明な型

不透明な戻り値はジェネリクスと組み合わせられます。呼び出し側にはShapeが見えますが、Scaled<Circle>の実装は非公開にできます。

// A generic decorator that also conforms to Shape
struct Scaled<S: Shape>: Shape {
    let base: S
    let k: Double
    func area() -> Double { base.area() * k * k }
}

// Factory still hides the concrete generic type
func makeScaledUnitCircle(k: Double) -> some Shape {
    Scaled(base: Circle(r: 1.0), k: k)
}

let s1 = makeScaledUnitCircle(k: 2)
print(s1.area())  // 4 * π

不透明な型を選ぶ場面

次のような場合は不透明な型を使います:

  • 実装を隠しながら静的型付けを維持したい場合
  • 具体的な型を公開せず、APIからプロトコルのビュー(例: Shape)を返したい場合
  • ジェネリック性を保ったままビルダーを連結するパイプライン/DSLを構築する場合

(次のレッスンでは存在型と比較します。)

不透明な結果型の定義

確認問題: some Pは何を保証しますか?

まとめ

まとめ: 不透明な結果型(some P)は具体的な型を隠しながら、静的ディスパッチを維持します。基になる型は関数ごとに固定されるため、整理され、高速で、カプセル化されたAPIに適しています。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「some P(不透明な結果型):具象型を隠す」レッスンは無料ですか?

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

「some P(不透明な結果型):具象型を隠す」で何を学びますか?

some P を返すと、具体的な戻り値の型を隠しながら P に準拠することを保証できます。呼び出し側は実装を公開せずに静的型付けの恩恵を得られます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「some P(不透明な結果型):具象型を隠す」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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