You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中KnownErrors与ErrorCode数据结构推导咨询

如何定义KnownErrors和ErrorCode以匹配现有代码?

现有如下ApiError结构体定义:

struct ApiError: Error {

    var statusCode: Int!
    let errorCode: String
    var message: String

    init(statusCode: Int = 0, errorCode: String, message: String) {
        self.statusCode = statusCode
        self.errorCode = errorCode
        self.message = message
    }

    var errorCodeNumber: String {
        let numberString = errorCode.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
        return numberString
    }

    private enum CodingKeys: String, CodingKey {
        case errorCode
        case message
    }
}

extension ApiError: Decodable {

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        errorCode = try container.decode(String.self, forKey: .errorCode)
        message = try container.decode(String.self, forKey: .message)
    }
}

以及网络请求处理的代码片段:

switch response.statusCode {
        case 200...299:
            do {
                return try JSONDecoder().decode(T.self, from: data)
            } catch {
                throw ApiError(
                    errorCode: KnownErrors.ErrorCode.decodingDataError.rawValue,
                    message: "decoding error"
                )
            }
        default:
            guard let decodedError = try? JSONDecoder().decode(ApiError.self, from: data) else {
                throw ApiError(
                    statusCode: response.statusCode,
                    errorCode: "0",
                    message: "Unknown backend error"
                )
            }
            if response.statusCode == 403 && decodedError.errorCode == KnownErrors.ErrorCode.expiredToken.rawValue {
                //exit session
            }
            throw ApiError(
                statusCode: response.statusCode,
                errorCode: decodedError.errorCode,
                message: decodedError.message
            )
        }

代码中使用了KnownErrors.ErrorCode.decodingDataError.rawValue与KnownErrors.ErrorCode.expiredToken.rawValue,需要定义对应的KnownErrors和ErrorCode结构以匹配调用方式。


解决方案

你需要将KnownErrors定义为一个结构体作为命名空间,内部嵌套一个带String类型原始值的ErrorCode枚举,这样就能匹配代码中的调用路径和rawValue的使用需求:

struct KnownErrors {
    // 定义带String原始值的枚举,每个case对应一个后端返回的错误码字符串
    enum ErrorCode: String {
        // 替换为实际后端返回的解码错误码字符串
        case decodingDataError = "DECODING_ERROR"
        // 替换为实际后端返回的token过期错误码字符串
        case expiredToken = "TOKEN_EXPIRED"
        
        // 可根据需求添加更多已知错误码case
        // case anotherError = "ANOTHER_ERROR_CODE"
    }
}

说明

  1. 命名空间设计:用KnownErrors结构体作为命名空间,避免ErrorCode枚举与其他同名类型冲突,同时符合代码中KnownErrors.ErrorCode的调用路径。
  2. String原始值:因为ApiError的errorCode是String类型,所以ErrorCode枚举指定原始值类型为String,每个case的rawValue直接对应后端返回的错误码字符串,能直接和decodedError.errorCode做字符串比较。
  3. 扩展性:后续新增已知错误码时,只需在ErrorCode枚举中添加新的case即可,维护更方便。

如果你不需要命名空间,也可以直接定义顶级枚举,但这样可能存在命名冲突风险,因此推荐使用嵌套枚举的方式。


内容的提问来源于stack exchange,提问作者soleil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:35:09