🫥

Swift エラー処理 Result型

に公開

Result型は、成功と失敗の両方を扱うためのジェネリックな列挙型で、エラーハンドリングや非同期処理でよく使われます。
Result型を使うことで関数が成功または、失敗する結果をより明確に表現できます。とのことです
Result型はSuccessとFailureの2つのジェネリクスパラメーターを持ちます Result<Success,Failure>

Result型の定義

enum Result<Success,Failure> where Failure: Error {
  case success(Succees)
  case failue(Failure)
}

success→ 成功時の値の型
Failure→ 失敗時のエラーの型 ※Failureは、Errorプロトコルに準拠している必要がある。

具体的な使用例

//enumで、NetworkErrorという列挙型を定義し、Errorプロトコルに準拠させている
enum NetworkError: Error {
  case badURL
  case requsestFailed
  case unkown
}

//関数を定義、引数ラベルfromを使用し、urlString引数の型をStringにしている、
//competion引数を定義し、引数型Resultを定義し、そのジェネリクト引数にString,NetworkErrorを定義している
func fetchData(from urlString:String,competion: (Result<String,NetworkError>) -> Void) {URLFoundationのフレームワークの一部で、URLを扱うためのクラス
//ガードでその生成したURLがnilでないことを確認している
//URL(string: urlString)でurlStringという文字列からURLオブジェクトを生成しようとしている
   guard let url = URL(string: urlString) else {
//nilの場合、failureとbadURLが返される
    completion(.failure(.badURL))
     return
}

//ネットワークリクエストのシミュレーション
//Swift標準ライブラリのメソッドBool.random()を使用※ランダムにtureかfalseを返す
//その結果をresultに代入している
let result = Bool.random()
//ifを使用して、tureの場合はcompletionにsuccessを渡す
if result {
  completion(.success("Data from\(urlString)"))
  } else {
//falseの場合はcompletionにfailureを渡す
   completion(.failure(.requestFailed))
  }
}
//生成したUrlを使用して、ランダムな結果の出力をしている
fetchData(from: "https://example.com") { result in
  switch result {
  case .success(let data):
    print("Succes: \(data)")
  case .failure(let error):
    switch error {
    case .badURL:
      print("Error:Bad URL")
    case .requestFailed:
      print("Error: Request failed")
    case .unknown:
       print("Error: Unknown error")
    }
  }
}

Discussion