【问题标题】:how to handle extra parameters on the swift model class如何处理 swift 模型类的额外参数
【发布时间】:2020-05-30 15:42:44
【问题描述】:

我是 swift 新手。我创建了一个可编码的模型类,当后端团队在其上添加额外的参数时,我的模型类不支持。有人可以解释一下如何实现这一点。

 public struct Posts : Codable {
        let`internal` : Bool?
        let documents : [Document]?
        let entityID : String?
      enum CodingKeys: String, CodingKey {
          case `internal` = "internal"
            case documents = "documents"
            case entityID = "entityID"
}
init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            `internal` = try (values.decodeIfPresent(Bool.self, forKey: .internal) ?? false)
            documents = try values.decodeIfPresent([Document].self, forKey: .documents)
            entityID = try (values.decodeIfPresent(String.self, forKey: .entityID) ?? "")
} }

我的编码看起来像这样有什么问题。

【问题讨论】:

  • 你的问题是什么,你到底想达到什么目标?

标签: swift codable


【解决方案1】:

您可以使用我给出的基本结构,而无需自定义init(decoder:) 方法,即使稍后添加新参数,它仍然可以工作。您可以根据需要添加它们。

public struct Posts: Codable {
    let`internal`: Bool?
    let documents: [Document]?
    let entityID: String?
}

注意:如果您想访问它们,您需要手动将新密钥添加到struct。这个结构只给出已经被struct 解析的内容。除非后端决定为这些键之一提供不同的值类型,否则这不会中断。如果添加了您想要访问的新密钥,请将 struct 修改为:

public struct Posts: Codable {
    let`internal`: Bool?
    let documents: [Document]?
    let entityID: String?
    let newPropertyName: NewPropertyType
}

【讨论】:

  • 是的。只有在 struct 中给出的属性名称的 rawValue 发生变化时才需要编码键。
  • 请注意,要获取已添加的新键,您需要将它们添加到此结构中。但这不会中断。
  • 有什么方法可以动态追加新添加的键。无需在 ios 中添加结构
  • 我的问题是我有一个像上面这样的现有模型类。后端团队不断改变原因,比如他们添加额外参数和更改现有键名,因此当我将数据转换为模型时。它总是失败可能是什么问题是更改密钥名称或添加额外参数的问题。请帮我解决这个问题
  • 在需要时更改 API 响应中的键不是一个选项,前端无法处理,只能向最终用户显示出现问题。我认为您应该联系后端团队,为您需要的 API 创建和维护一个模型,而不是对模型进行重大更改,然后对其附加新的更改。
猜你喜欢
  • 2012-09-01
  • 2023-03-11
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多