Swift 中的服务器响应不匹配模型(无记录)

Server Response Not matching model (no records) in Swift

抱歉,如果问题含糊不清,但我会尽量表达。

我有以下型号:

struct Posts: Codable, Identifiable {
    let id: String
    let title: String
    let content: String
    
    enum CodingKeys: String, CodingKey {
        case id = "_id"
        case title
        case content
    }
}

如果找到 post,服务器响应将是相同的模型,没有问题,因为 JSON 与模型匹配。

但是如果服务器 returns 没有找到错误 post,这将是响应 JSON:

{
"error": "No records found"
}

发生这种情况时我会收到以下信息:

keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "id", intValue: nil) ("id").", underlyingError: nil))

处理此问题的最佳方法是什么?

更新:

谢谢jnpdx!

所以,我做了一个 ErrorResponse 结构,它确实捕获了这样的错误响应:


struct ErrorResponse: Codable {
    let error: String
    
    enum CodingKeys: String, CodingKey {
        case error
    }
}

那么在我的 APIServices 文件中,我该如何处理呢?

// this is what gets the Post data

let decodedData = try JSONDecoder().decode(Post?.self, from: data)

//Do I need another JSONDecoder to also catch the error below the above line like this?

let decodedDataError = try JSONDecoder().decode(ErrorResponse?.self, from: data)

在评论中,我们讨论了创建一个结构来模拟错误,看起来您已经完成了。要解决您的后续问题,不,您不需要单独的 JSONDecoder。你也可能不应该解码选项。

不仅有一种方法可以正确执行此操作,而且您的函数可能看起来像这样:

let decoder = JSONDecoder()
do {
  let post = try decoder.decode(Post.self, from: data)
  //handle the post
} catch {
  //try to decode an error
  if let error = try? decoder.decode(ErrorResponse.self, from: data) {
    //handle an API error
  }
  //handle an unknown error
}