カテゴリ: Swift 更新日: 2026/01/09

Swift Result型入門|成功/失敗を明示する実装パターンを初心者向けに徹底解説

Swift Result型入門|成功/失敗を明示する実装パターン
Swift Result型入門|成功/失敗を明示する実装パターン

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

生徒

「先生、SwiftでResult型っていうのを見たんですけど、これは何をするものなんですか?」

先生

「Result型は、処理が成功したか失敗したかをはっきりと表現するための仕組みなんです。成功なら結果の値、失敗ならエラーを持たせることができます。」

生徒

「じゃあ、普通にエラーを投げるのとどう違うんですか?」

先生

「エラーを投げる方法もありますが、Result型を使うと成功と失敗の両方をひとつの型で扱えるので、コードが分かりやすくなるんです。実際に使い方を見ていきましょう!」

1. SwiftのResult型とは?

1. SwiftのResult型とは?
1. SwiftのResult型とは?

SwiftのResult型は、処理の結果が「成功」か「失敗」かを安全に表現するための型です。成功したときには値を持ち、失敗したときにはエラーを持つことができます。つまり「成功か失敗か」という二択をはっきりとコードで表現できるのが特徴です。

Result型は以下のように定義されています。


enum Result<Success, Failure: Error> {
    case success(Success)
    case failure(Failure)
}

ここでSuccessは成功時の値の型、Failureは失敗時のエラーの型を表します。これにより、関数の返り値に「成功か失敗か」をまとめて返せるようになります。

2. Result型の基本的な使い方

2. Result型の基本的な使い方
2. Result型の基本的な使い方

例えば「文字列を数字に変換する」処理を考えてみましょう。成功すれば数値を返し、失敗すればエラーを返すようにResult型を使います。


enum ParseError: Error {
    case invalidFormat
}

func stringToInt(_ str: String) -> Result<Int, ParseError> {
    if let number = Int(str) {
        return .success(number)
    } else {
        return .failure(.invalidFormat)
    }
}

このように書くことで、「成功か失敗か」をひとつの返り値で明示できます。

3. Result型の値を取り出す方法

3. Result型の値を取り出す方法
3. Result型の値を取り出す方法

Result型を使ったあとは、switch文を使って「成功か失敗か」を分けて処理するのが基本です。


let result = stringToInt("123")

switch result {
case .success(let value):
    print("変換成功: \(value)")
case .failure(let error):
    print("変換失敗: \(error)")
}

実行すると、次のように出力されます。


変換成功: 123

このようにResult型を使えば、成功と失敗を見やすく分けて書けます。

4. Result型とdo-catchの違い

4. Result型とdo-catchの違い
4. Result型とdo-catchの違い

Swiftにはthrowdo-catchを使ったエラーハンドリングもあります。しかし、throwは処理が途中で中断されるため、呼び出し側での扱いが少し複雑になります。

一方、Result型は返り値として「成功か失敗か」を受け取れるので、非同期処理や複数の処理を組み合わせる場面で特に便利です。たとえばネットワーク通信の結果を扱うときによく使われます。

5. mapとflatMapでResultを変換する

5. mapとflatMapでResultを変換する
5. mapとflatMapでResultを変換する

Result型は「成功の値」に対して変換を行う便利なメソッドを持っています。mapを使えば、成功した場合だけ値を変換できます。


let result = stringToInt("10")

let doubled = result.map { $0 * 2 }

switch doubled {
case .success(let value):
    print("2倍にした結果: \(value)")
case .failure(let error):
    print("エラー: \(error)")
}

この例では、成功したときにだけ値を2倍に変換しています。失敗した場合はそのままエラーが伝わります。

6. 非同期処理でのResult活用

6. 非同期処理でのResult活用
6. 非同期処理でのResult活用

現実的な開発では、サーバーからデータを取ってくる「非同期処理」でよくResult型が使われます。非同期処理とは、すぐに結果が返らず、時間がかかる処理のことです。


func fetchData(completion: (Result<String, Error>) -> Void) {
    let success = true
    if success {
        completion(.success("データ取得成功"))
    } else {
        completion(.failure(NSError(domain: "Network", code: -1)))
    }
}

fetchData { result in
    switch result {
    case .success(let data):
        print(data)
    case .failure(let error):
        print("エラー: \(error)")
    }
}

このように、非同期処理の結果をResult型で受け取れば、成功と失敗を明示的に分けて書けるので安心です。

7. 初心者が覚えておくべきResult型のポイント

7. 初心者が覚えておくべきResult型のポイント
7. 初心者が覚えておくべきResult型のポイント
  • Result型は「成功」か「失敗」を表すための型
  • 成功なら値を、失敗ならエラーを持たせる
  • switch文で分けて処理できる
  • mapやflatMapで変換も可能
  • 非同期処理で特に便利に使える

これらを理解しておくと、Swiftでのエラーハンドリングが一気に分かりやすくなります。

まとめ

まとめ
まとめ

SwiftのResult型で成功と失敗を明確に扱う重要性

ここまで、SwiftのResult型について基礎から実践的な使い方までを順を追って学んできました。Result型は、処理が成功したのか、それとも失敗したのかを一つの型で明確に表現できる点が最大の特徴です。従来のエラーハンドリングでは、throwとdo catchを使ってエラーを処理する方法が一般的でしたが、Result型を使うことで、関数の戻り値そのものに成功と失敗の情報を含めることができます。これにより、処理の結果がどうなるのかを呼び出し側が一目で理解でき、コード全体の見通しが非常に良くなります。

特に初心者にとっては、「この関数は必ず値を返すのか」「失敗する可能性があるのか」といった点が分かりにくくなりがちです。Result型を使えば、関数の型定義を見ただけで、成功時の値の型と失敗時のエラーの型がはっきり分かります。そのため、Swiftらしい安全なプログラム設計を自然と身に付けることができます。

Result型とエラーハンドリングの実践的な使い分け

記事の中では、Result型とdo catchによるエラーハンドリングの違いにも触れました。throwを使った方法は、処理の途中でエラーが発生した場合に即座に処理を中断できるため、シンプルな処理には向いています。一方で、非同期処理や複数の結果を扱う場面では、Result型の方が柔軟に使えるケースが多くあります。成功と失敗を値として扱えるため、処理の流れを自分で制御しやすくなるからです。

また、mapやflatMapを使えば、成功した場合だけ値を変換し、失敗した場合はそのままエラーを引き継ぐことができます。これにより、無駄な条件分岐を書かずに、読みやすく意図が伝わるコードを書くことが可能になります。Result型は単なるエラー処理の仕組みではなく、Swiftの関数型プログラミング的な考え方にもつながる重要な要素だと言えるでしょう。

Result型を使ったサンプルプログラムで振り返る


enum LoginError: Error {
    case emptyName
}

func login(name: String) -> Result<String, LoginError> {
    if name.isEmpty {
        return .failure(.emptyName)
    } else {
        return .success("ようこそ、\(name)さん")
    }
}

let result = login(name: "太郎")

switch result {
case .success(let message):
    print(message)
case .failure(let error):
    print("ログイン失敗: \(error)")
}

このサンプルでは、ログイン処理をResult型で表現しています。名前が空の場合は失敗としてエラーを返し、正常な場合は成功としてメッセージを返します。このように、日常的な処理をResult型で表すことで、成功と失敗の分岐が明確になり、後からコードを見返したときにも理解しやすくなります。実際のアプリ開発では、ネットワーク通信や入力チェックなど、さまざまな場面で同じ考え方を応用できます。

先生と生徒の振り返り会話

生徒

Result型を使うと、成功と失敗を一つの形で扱えるのが分かりました。関数の戻り値を見るだけで、失敗する可能性があるかどうかが分かるのは安心ですね。

先生

その通りです。Result型は、処理の結果を曖昧にせず、必ず成功か失敗のどちらかで表現するための仕組みです。コードを書く人にも読む人にも優しい設計になります。

生徒

非同期処理でResult型がよく使われる理由も理解できました。成功と失敗をコールバックで分けて受け取れるのは便利ですね。

先生

そうですね。ネットワーク処理や時間のかかる処理では、Result型を使うことでエラー処理が整理され、バグも減らしやすくなります。

生徒

これからは、throwだけでなくResult型も状況に応じて使い分けていきたいです。

先生

その意識がとても大切です。Result型を正しく使いこなせるようになると、Swiftでの設計力が一段階上がります。ぜひ実際のコードで積極的に使ってみてください。

カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のオブジェクト指向の特徴を完全ガイド!初心者でも理解できる他言語との違い
New2
Go言語
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
New3
Kotlin
Kotlinのクラス設計に役立つベストプラクティスまとめ|初心者でもわかるクラス設計の考え方
New4
Kotlin
Kotlinでアーキテクチャ設計の基本!MVC・MVP・MVVMの違いを解説
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Kotlin
Kotlinのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.6
Java&Spring記事人気No6
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.7
Java&Spring記事人気No7
Go言語
Go言語のWebアプリにおけるセキュリティベストプラクティス集
No.8
Java&Spring記事人気No8
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!