我有一个服务类,它提供了几个调用后端的方法,这些方法的一个共同主题是我可以为成功和错误情况传递回调:
func makeCall(onSuccess: @escaping APIResponse, onError: @escaping APIError)
类型APIError
的定义如下:
typealias APIError = (Error) -> Void
此外,我有一个这样的枚举APICallError
:
enum APICallError: Error {
case insufficientCredentials
case malformedResponse
case forbidden
}
所以在我的服务方法中,如果结果包含一个错误对象,那么我可以调用onError(response.result.error!)
(强制解包只是为了简洁,我并没有真正这样做)并且还传递了我自己的枚举值。 HTTP结果不够具体,例如onError(APICallError.insufficientCredentials)
。
这很好用。
问题是,我无法弄清楚如何在我的客户端代码中评估进入的error
参数是APICallError
类型以及其中哪一个特别。如果我这样做:
if let callError = error as? APICallError {
if callError == .forbidden {
// ...
}
}
执行并没有超过类型转换。 if error is APICallError
似乎也不起作用。
如何将error
参数转换为我知道的APICallError
枚举值,因为当我print(error)
时,它会给我myapp.APICallError.forbidden
?
答案 0 :(得分:2)
我试图在Playground中模拟你在问题中发布的内容,而我认为你所做的事应该适合你。
if error is APICallError
也在发挥作用。 if let
条件失败的一种可能原因可能是error
为nil
。使用断点检查是否是这种情况。
typealias APIError = (Error) -> Void
//The error type used in your question
enum APICallError: Error {
case insufficientCredentials
case malformedResponse
case forbidden
}
//A different error type for comparison
enum AnotherError: Error {
case error1
case error2
case error3
}
let apiCallError:Error = APICallError.insufficientCredentials
let anotherError:AnotherError = AnotherError.error1
//Closure definition
var onError: APIError? = { inputError in
if let apiError = inputError as? APICallError {
print("APICallError")
}
if let anotherError = inputError as? AnotherError {
print("AnotherError")
}
}
//Above defined closure is called here below...
onError?(apiCallError)
onError?(anotherError)
控制台输出:
APICallError
AnotherError
答案 1 :(得分:-1)
您需要使用枚举rawValue构造函数。
if let callError = APICallError(rawValue: error) {
if callError == .forbidden {
...
}
} else {
// was not an APICallError value
}