【Swift/Combine】mapErrorメソッドの使い方!エラーを変換して流す方法

この記事からわかること
- SwiftのCombineフレームワークの使い方
- mapErrorメソッドとは?
- エラーを変換する方法
index
[open]
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
mapErrorメソッドの使い方
func mapError<E>(_ transform: @escaping (Self.Failure) -> E) -> Publishers.MapError<Self, E> where E : Error
SwiftのCombineフレームワークのmapError
メソッドは流れてきたエラーに対して新しいエラーに変換して再度流すことができるメソッドです。
使用方法を見てみます。myDivide
メソッドDivisionByZeroError
をスローする可能性のあるメソッドです。しかし実際に流れてくるエラーを別のMyGenericError
に変換したい場合にmapError
が活用できます。
struct DivisionByZeroError: Error {}
struct MyGenericError: Error { var wrappedError: Error }
/// 割り算をするメソッド
/// 0が渡された場合はエラーを投げる
func myDivide(_ dividend: Double, _ divisor: Double) throws -> Double {
guard divisor != 0 else { throw DivisionByZeroError() }
return dividend / divisor
}
let divisors: [Double] = [5, 4, 3, 2, 1, 0]
divisors.publisher
.tryMap { try myDivide(1, $0) }
.mapError { MyGenericError(wrappedError: $0) }
.sink(
receiveCompletion: { print ("completion: \($0)") },
receiveValue: { print ("value: \($0)", terminator: " ") }
)
その他のエラーハンドリングメソッド
オペレーター | 説明 | 使用場面 |
---|---|---|
replaceError | エラーを無視してデフォルト値を流す | エラーを無視して安全に値を流したい場合 |
catch | エラーが発生した際に代わりのPublisherを流す | エラーごとに異なる処理をしたい場合 |
mapError | エラーを別のエラー型に変換する | エラー型を統一したい場合 |
retry | エラーが発生した場合に処理を再試行する | 再試行可能な操作を扱いたい場合 |
tryMap | マッピング中にエラーを投げられる処理を実行する | エラー処理をマッピングと統合したい場合 |
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。