ios - Swift 错误处理——结构/类与枚举

标签 ios swift struct error-handling enums

我正在尝试对我正在使用的 API 可能返回的错误以及可能的网络错误进行建模。

我正在努力弄清楚我是否应该使用 Struct/Class 方法,其中每种类型的错误都被建模为 Struct/Class,或者 Enum 方法。

这里有一些需要考虑的注意事项:

  1. 根据出现的问题,相同的 API 调用可以使用不同的media-types(因此不同的 JSON)返回不同的错误。所以我的错误有不同的属性。我不想将请求响应公开为简单的 JSON 对象/字典。
  2. 我希望由客户端/服务器问题引起的错误也具有 httpStatusCode 属性(对于与无连接相关的错误,它将为 nil)
  3. 我想要一个错误来指示正确的本地化消息的连接问题。
  4. 我想对 sync 调用(与 throws 一起使用)和 async 调用(用作完成 block )

主要是因为第一个要求很难弄清楚如何沿着 Enum 的方式走下去。但也许我遗漏了一些东西,也许 Enum 类型中仍有一些我不知道的功能。

如有任何建议,我们将不胜感激。

最佳答案

通常 enum 是处理 Swift 错误的最佳方法。要提供不同的类型,您可以使用关联值,对于本地化描述,您可以为您的枚举实现 LocalizedError 协议(protocol),例如:

enum NetworkError : Error, LocalizedError {
    case noInternet
    case httpStatus(Int)
    case unknown(Error)
    
    public var errorDescription: String? {
        switch self {
            case .noInternet:
                return "No Internet"
                
            case .httpStatus(let code):
                return "HTTP status code: \(code)"
                
            case .unknown(let error):
                return "Error: \(error)"
        }
    }
}

let err1 = NetworkError.noInternet
print(err1.localizedDescription)

let err2 = NetworkError.httpStatus(404)
print(err2.localizedDescription)

let err3 = NetworkError.unknown(error)
print(err3.localizedDescription)

/*
Prints:

No Internet
HTTP status code: 404
Error: error
*/

但是如果您有错误的通用数据,您应该实现 struct 来保存具有错误类型的所需属性:

struct ResponseError: Error {
    enum ErrorType {
        case badStatusCode
        case noJson
        case invalidJson(Error)
    }

    let type: ErrorType
    let statusCode: Int
}

let err = ResponseError(type: .badStatusCode, statusCode: 404)

从文档中阅读有关以下内容的更多信息:https://developer.apple.com/documentation/swift/error

关于ios - Swift 错误处理——结构/类与枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34336627/

相关文章:

swift - JSON 序列化 swift 崩溃

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

ios - ZBarSymbolSet崩溃

ios - iOS:Facebook登录错误

ios - 触摸Node的Swift访问方法

c++ - 将光标位置存储在类对象中(ncurses c++)

c++ - std::sort 函数给出 "Bus error: 10"

ios - UIDocumentPickerViewController - 未调用委托(delegate)方法

ios - 如何在容器 View 中的 tableview 周围获取可见框架

ios - 排队的 ViewControllers 被一个接一个地推送