【问题标题】:How to use decodable protocol with custom type values in Swift?如何在 Swift 中使用带有自定义类型值的可解码协议?
【发布时间】:2020-01-31 04:15:18
【问题描述】:

根据我的要求,我有两种类型的响应:第一种:

{
    "status": "success"
    "data": {
        "user_id": 2,
        "user_name": "John"      
    }
}

第二个是:

{
    "status": "error",
    "data": [],
}

我正在使用这样的结构:

struct ValyutaListData:Decodable {
    let status: String? 
    let data: [String]?
}

但是如果响应是第一类响应,那么就会发生错误。因为在第一个类型响应数据不是数组。它是 Json 对象。然后我使用这样的结构:

struct ValyutaListData:Decodable {
    let status: String? 
    let data: Persondata?
}

struct Persondata: Decodable{
    let user_id: Int?
    let user_name: String?
}

如果响应是第二种响应,则会发生错误。动态类型的 JSON 应该使用什么样的结构?谢谢。

【问题讨论】:

  • 为什么不让data 的值始终是单个字典的数组?那么类型总是一个数组,如果没有数据,它就只是一个空数组。如果有数据,那么你可以访问data的数组中的第一个元素,它会是一个字典吗?
  • @DavidChopin 我不写服务。后端开发者是另一个开发者。
  • 没有返回数据时,值是否只是一个数组?
  • @DavidChopin 我可以告诉后端开发人员更正 json 格式。但我想为这个问题找到解决方案:)
  • :) 这是一个很好的反对意见。我只是想保持它非常简单。然后写init(from:) 是更好的方法。

标签: json swift struct decodable


【解决方案1】:

一个合理的解决方案是使用关联类型的枚举

struct User : Decodable {
    let userId: Int
    let userName: String
}

enum Result : Decodable {
    case success(User), failure

    enum CodingKeys: String, CodingKey { case status, data }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let status = try container.decode(String.self, forKey: .status)
        if status == "success" {
            let userData = try container.decode(User.self, forKey: .data)
            self = .success(userData)
        } else {
            self = .failure
        }
    }
}

并使用它

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let result = try decoder.decode(Result.self, from: data)
    switch result {
      case .success(let user): print(user)
      case .failure: print("An error occurred")
    }
} catch { print(error) }

【讨论】:

  • 感谢您的这篇文章。我正在尝试理解和使用它:)
  • 我什么都不懂。很难
  • status 可以是“成功”或“错误”,如果成功,用户将被解码并附加到 success 案例,否则返回 failure 案例。
  • @NicatGüliyev 我建议你阅读Swift Language Guide. 它有一个关于枚举的完整部分,我建议你查看一下。说真的,这是一本很棒的书。如果我在管理一个团队,我不会让任何人在全面检查产品代码之前接触它。否则,我们会在不知道我们可以使用哪些音符的情况下尝试创作一首歌曲。
猜你喜欢
  • 2017-11-07
  • 2020-08-16
  • 2020-06-17
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多