some P(不透明な結果型):具象型を隠す
some P を返すと、具体的な戻り値の型を隠しながら P に準拠することを保証できます。呼び出し側は実装を公開せずに静的型付けの恩恵を得られます。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- some P(不透明な結果型):具象型を隠す
- any P(存在型):トレードオフと動的ディスパッチ
- some、any、ジェネリクスの使い分け