カテゴリ: Swift 更新日: 2025/12/02

SwiftのOpaque Result Type(some)とプロトコル設計を徹底解説!初心者向けガイド

Swift Opaque Result Type(some)とプロトコルの設計
Swift Opaque Result Type(some)とプロトコルの設計

先生と生徒の会話形式で理解しよう

生徒

「先生、Swiftでsomeって書かれているコードを見たんですけど、これは何を意味しているんですか?」

先生

someはOpaque Result Type(不透明な戻り値の型)と呼ばれる仕組みです。『具体的な型は隠すけど、あるプロトコルには必ず従っているよ』ということを表すんですよ。」

生徒

「えっ、具体的な型を隠すってどういうことですか?」

先生

「例えば、返り値がIntかもしれないしStringかもしれない。でも『Equatableには従っている』と約束できれば、呼び出す側は安心して使えるという考え方です。」

生徒

「なるほど!型を隠すことで設計が柔軟になるんですね!」

1. Opaque Result Type(some)とは?

1. Opaque Result Type(some)とは?
1. Opaque Result Type(some)とは?

SwiftのOpaque Result Typeは、関数やプロパティの戻り値の具体的な型を隠しつつ、その型があるプロトコルに適合していることだけを示す機能です。これにより、実装の詳細を外に漏らさず、必要なインターフェースだけを公開できます。プログラミング初心者にわかりやすく説明すると「どんな靴を履いているかは秘密だけど、必ず靴は履いていると保証する」イメージです。

2. someを使った基本例

2. someを使った基本例
2. someを使った基本例

例えば、数字を返すけど型を隠したいときにsomeを使います。


func makeNumber() -> some Equatable {
    return 42
}

let value = makeNumber()
print(value)

42

この場合、実際にはIntを返していますが、外側には「Equatableであること」しか公開していません。

3. プロトコルと組み合わせた設計

3. プロトコルと組み合わせた設計
3. プロトコルと組み合わせた設計

someはプロトコルと一緒に使うと威力を発揮します。具体的な型を隠しながらも「このプロトコルには従っている」と宣言できるからです。


protocol Shape {
    func area() -> Double
}

struct Circle: Shape {
    var radius: Double
    func area() -> Double { radius * radius * .pi }
}

struct Square: Shape {
    var side: Double
    func area() -> Double { side * side }
}

func makeShape() -> some Shape {
    return Circle(radius: 5)
}

let shape = makeShape()
print(shape.area())

78.53981633974483

ここではmakeShapeの返り値は「Shapeに準拠している何か」であることは保証されますが、実際にCircleを返していることは外側には隠されています。

4. someとanyの違い

4. someとanyの違い
4. someとanyの違い

初心者が混乱しやすいのがsomeanyの違いです。

  • someは「必ず1つの具体的な型」であることを保証します。型は隠されますが、裏では1種類に固定されています。
  • anyは「どの型でもよい」ことを意味します。複数の型を扱えるため柔軟ですが、パフォーマンスや機能制限がある場合があります。

例えると、someは「この箱には必ずリンゴが入っているけど、外からはリンゴとしかわからない」、anyは「この箱には果物が入っていて、リンゴかもしれないしバナナかもしれない」という違いです。

5. Opaque Result Typeを使うメリット

5. Opaque Result Typeを使うメリット
5. Opaque Result Typeを使うメリット

Swiftでsomeを使うメリットは以下の通りです。

  • 実装の詳細を隠すことで、柔軟な設計ができる
  • 返り値の具体的な型に依存しないので、将来の変更に強い
  • プロトコルと組み合わせることで、拡張性が高まる

アプリ開発の現場では「実装は変えたいけど、公開するインターフェースは変えたくない」といったニーズに応えられます。

6. 初心者がつまずきやすいポイント

6. 初心者がつまずきやすいポイント
6. 初心者がつまずきやすいポイント

Opaque Result Typeを学ぶときに初心者がよくつまずくのは次のような点です。

  • 1つの関数で複数の異なる型を返すことはできない(例えばif文でIntとStringを返すのはNG)
  • someはあくまで「型を隠す」ためのものであって「自由に変えられる」わけではない
  • ジェネリクス(汎用的な型)と混同しやすい

そのため、まずは「返り値の型を外に出したくないときに使う」というシンプルな理解から始めるのが安心です。

カテゴリの一覧へ
新着記事
Go言語の構造体でインターフェースを実装する方法を初心者向けにやさしく解説!
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
Go言語の文字列フォーマット!fmt.Sprintfで簡単に出力を整形する方法
Go言語のエラーと例外の違いを初心者向けに整理!わかりやすく解説
人気記事
No.1
Kotlin・Go・Swift記事の人気No1
Swiftのwhile文とrepeat while文を完全マスター!初心者にもわかる繰り返し処理の使い方と違い
No.2
Kotlin・Go・Swift記事の人気No2
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.3
Kotlin・Go・Swift記事の人気No3
Swift入門ガイド|基本構文と書き方をマスターしよう
No.4
Kotlin・Go・Swift記事の人気No4
Kotlinの正規表現(Regex)の使い方をやさしく解説!文字列操作の基本を初心者向けに学ぼう
No.5
Kotlin・Go・Swift記事の人気No5
Kotlinのコンパニオンオブジェクトとは?初心者向けに使い方と役割をわかりやすく解説!
No.6
Kotlin・Go・Swift記事の人気No6
Kotlinで画面を作る!レイアウトXMLとビューの基本操作をやさしく解説
No.7
Kotlin・Go・Swift記事の人気No7
Kotlinのwhen式を完全ガイド!初心者でもわかるパターンマッチング的な使い方
No.8
Kotlin・Go・Swift記事の人気No8
Swiftのオプショナル型とは?初心者でもわかる使い方とアンラップの基礎