🫥
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) {
※URLはFoundationのフレームワークの一部で、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