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" } }
说明
- 命名空间设计:用
KnownErrors结构体作为命名空间,避免ErrorCode枚举与其他同名类型冲突,同时符合代码中KnownErrors.ErrorCode的调用路径。 - String原始值:因为
ApiError的errorCode是String类型,所以ErrorCode枚举指定原始值类型为String,每个case的rawValue直接对应后端返回的错误码字符串,能直接和decodedError.errorCode做字符串比较。 - 扩展性:后续新增已知错误码时,只需在
ErrorCode枚举中添加新的case即可,维护更方便。
如果你不需要命名空间,也可以直接定义顶级枚举,但这样可能存在命名冲突风险,因此推荐使用嵌套枚举的方式。
内容的提问来源于stack exchange,提问作者soleil
相关产品推荐
相关产品推荐

