在 Swift 中,mapError 是一个专门用于处理错误类型的函数,通常与 Result 类型搭配使用。它可以将一个 Result 的错误值转换为另一个错误值,同时保持 Result 的成功值不变。
mapError 的用法
如果 Result 是 .failure,mapError 会对错误值应用一个转换闭包。
如果 Result 是 .success,mapError 什么也不做,保留成功值。
基本用例
定义一个 Result 类型的值
enum MyError: Error {
case invalidInput
case networkError
}
enum AnotherError: Error {
case generalError
case timeout
}
// 一个失败的 Result
let result: Result<Int, MyError> = .failure(.invalidInput)
// 使用 mapError 将错误类型转换为 AnotherError
let newResult = result.mapError { error -> AnotherError in
switch error {
case .invalidInput:
return .generalError
case .networkError:
return .timeout
}
}
print(newResult) // 输出:failure(generalError)
如何与 get() 一起使用
结合 Result 的 get() 方法,mapError 可以将错误转化为更熟悉的类型,然后再抛出它:
do {
let successValue = try newResult.get()
print("Success: \(successValue)")
} catch {
print("Caught Error: \(error)") // 输出 Caught Error: generalError
}
对 Result 成功值的无影响性
mapError 不会改变成功值:
let successResult: Result<Int, MyError> = .success(42)
// 使用 mapError 处理错误
let transformedResult = successResult.mapError { error -> AnotherError in
return .generalError // 不会调用这个闭包,因为是成功状态
}
print(transformedResult) // 输出:success(42)
与 map 联合使用
map 和 mapError 可联合使用,分别处理成功值和错误值:
let result: Result<Int, MyError> = .failure(.invalidInput)
let finalResult = result
.map { $0 * 2 } // 处理成功值
.mapError { error -> AnotherError in // 处理错误值
switch error {
case .invalidInput:
return .generalError
case .networkError:
return .timeout
}
}
print(finalResult) // 输出:failure(generalError)
使用场景
1、错误类型统一化
将不同的错误类型转换为一个通用的错误类型,便于后续处理。
2、日志或调试信息
在转换错误类型时,可以添加日志或调试信息。
3、链式操作
在复杂的链式操作中处理错误类型,简化代码逻辑。
总结
mapError 主要用于 Result 的 .failure 情况。
它保留成功值,只对错误值进行转换。
常用于错误类型的转换、统一处理以及增强错误信息。
因为map并不会处理Result的.failure,所以mapError实际上可以理解为map在Result中的扩展功能,扩展了原来map不处理.failure的功能。
相关文章
Swift高阶函数map:https://fangjunyu.com/2024/12/21/swift%e9%ab%98%e9%98%b6%e5%87%bd%e6%95%b0map/