将值转换为继承自Error的枚举

时间:2018-04-12 16:16:46

标签: ios swift enums casting

我有一个服务类,它提供了几个调用后端的方法,这些方法的一个共同主题是我可以为成功和错误情况传递回调:

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

2 个答案:

答案 0 :(得分:2)

我试图在Playground中模拟你在问题中发布的内容,而我认为你所做的事应该适合你。

if error is APICallError也在发挥作用。 if let条件失败的一种可能原因可能是errornil。使用断点检查是否是这种情况。

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
}