在我的Swift应用程序中优化错误处理时,我遇到了以下奇怪的行为。我的自定义错误类型实现了LocalizedError
,因此我可以向用户提供errorDescription
。由于我不能依赖第三方库来执行相同操作,因此我只有一个ErrorWrapper
枚举case underlying(_: Error)
:
import Foundation
enum CustomError: Error {
case test(_: String)
}
extension CustomError: LocalizedError {
var errorDescription: String {
switch self {
case let .test(err):
return "An error occured: \(err)"
}
}
}
enum ErrorWrapper: Error {
case underlying(_: Error)
}
extension ErrorWrapper: LocalizedError {
var errorDescription: String {
switch self {
case let .underlying(error) where error is LocalizedError:
// I verified execution jumps into this block,
// but error.errorDescription is nil
return (error as! LocalizedError).errorDescription ?? "Unknown error"
case let .underlying(error):
return error.localizedDescription
}
}
}
let err = CustomError.test("Foo")
let wrapped = ErrorWrapper.underlying(err)
print(err.errorDescription) // prints: "An error occured: Foo\n"
print(wrapped.errorDescription) // prints: "Unknown error\n"
有没有办法解决这个问题?我考虑过实现我的自定义错误协议,但是如果可能的话,我想坚持使用Swift的内置错误协议。