首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Swift.Result和Enum确定错误响应

如何从Swift.Result和Enum确定错误响应
EN

Stack Overflow用户
提问于 2022-06-12 17:04:26
回答 1查看 302关注 0票数 0

我创建了一个使用Swift.Result从URLSession返回图像和错误的方法。我还为错误创建了一个Enum

当返回Swift.Result错误时,如何区分4个枚举之间的区别?

代码语言:javascript
运行
复制
fetchImage(with: url) { (result) in
    switch result {

    case .failure(let err):
        print(err)

        // how can I determine which of the 4 enum errors was returned?

        /* Example
        if failErr { ... }
        if responseStatusCodeErr { ... }
        if dataIsNil { ... }
        if catchErr { ... }
        */

    case .success(let img):
        // ...
    }
}

Enum:

代码语言:javascript
运行
复制
enum SessionDataTaskError: Error {
    
    case failErr(Error)
    case responseStatusCodeErr(Int)
    case dataIsNil
    case catchErr(Error)
}

URLSession:

代码语言:javascript
运行
复制
fetchImage(with url: URL, completion: @escaping (Swift.Result<[UIImage], Error>)->Void) {

    URLSession.shared.dataTask(with: url) { (data, res, error) in

        if let error = error {
            completion(.failure(SessionDataTaskError.failErr(error)))
            return
        }
    
        if let response = res as? HTTPURLResponse {
            guard 200 ..< 300 ~= response.statusCode else {
                completion(.failure(SessionDataTaskError.responseStatusCodeErr(response.statusCode)))
                return
            }
        }
    
        guard let data = data else {
            completion(.failure(SessionDataTaskError.dataIsNil))
            return
        }
    
        do {

            // all good ...

        } catch {

            completion(.failure(SessionDataTaskError.catchErr(error)))
        }
    }.resume()
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-12 17:17:20

首先,我将将完成处理程序更改为只使用SessionDataTaskError作为Result的错误类型,因为您从不使用任何其他类型的Error调用它。

代码语言:javascript
运行
复制
func fetchImage(with url: URL, 
    completion: @escaping (Swift.Result<[UIImage], SessionDataTaskError>)->Void) {

然后,可以使用模式匹配来匹配以下4种错误:

代码语言:javascript
运行
复制
fetchImage(with: url) { (result) in
    switch result {
    case .failure(let error):
        print(error)
        switch error {
        case .failErr:
            // ...
        case .responseStatusCodeErr:
            // ...
        case .dataIsNil:
            // ...
        case .catchErr:
            // ...
        }
    case .success(let img):
        // ...
    }
}

如果在每种情况下都执行不同的操作,则可以通过执行以下操作来避免嵌套开关:

代码语言:javascript
运行
复制
fetchImage(with: url) { (result) in
    switch result {

    case .failure(.failErr):
        // ...
    case .failure(.responseStatusCodeErr):
        // ...
    case .failure(.dataIsNil):
        // ...
    case .failure(.catchErr):
        // ...
    case .success(let img):
        // ...
    }
}

如果fetchImage可以产生不同类型的错误,并且只想检查四个SessionDataTaskError,则可以使用类型模式let error as SessionDataTaskError,并添加一个额外的大小写来处理其他类型的错误。

代码语言:javascript
运行
复制
fetchImage(with: url) { (result) in
    switch result {
    case .failure(let error as SessionDataTaskError):
        print(error)
        switch error {
        case .failErr:
            // ...
        case .responseStatusCodeErr:
            // ...
        case .dataIsNil:
            // ...
        case .catchErr:
            // ...
        }
    case .failure(let otherError):
        print("Other Error:", otherError)
    case .success(let img):
        // ...
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72594282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档