【问题标题】:Parse JSON nil value using Coding Protocol使用编码协议解析 JSON nil 值
【发布时间】:2018-11-26 13:03:09
【问题描述】:

假设我有 Opportunity 类,带有可选的 code 字段

class Opportunity: Codable {

    let id: String
    let code: String?

    enum OpportunityKeys: String, CodingKey {

        case id = "opportunityId"
        case code = "opportunityCode"
    }

    required init(from decoder: Decoder) throws {

        let values = try decoder.container(keyedBy: OpportunityKeys.self)

        id = try values.decode(String.self, forKey: .id)
        if let code = try? values.decode(String.self, forKey: .code) {
            self.code = code
        }
    }
}

有没有比使用 if let 更好地解析 nil 值的方法?

【问题讨论】:

  • @Larme,感谢您指出这一点,但我要问的是有没有比 if let 更好的方法来解析 nil 值。另一个问题是询问 decode 和 decodeIfPresent 之间的区别。我相信他们是不同的!你怎么看?
  • 如果可以为零,则使用decodeIfPresent(),如链接问题和@vadian所述。
  • 为了将来参考,decodeIfPresent 是在合成的init(from:) 中调用可选属性的默认方法。这意味着如果您让编译器合成它(将 OpportunityKeys 重命名为 CodingKeys 并删除您的 init(from:) 实现),您将获得相同的行为。

标签: ios json swift swift4


【解决方案1】:

是的,有。

由于code 是可选的只需替换

if let code = try? values.decode(String.self, forKey: .code) {
    self.code = code
}

code = try? values.decode(String.self, forKey: .code)

【讨论】:

  • 使用 try?,您将在两种情况下将代码设置为 nil:1-解码失败(由于类型不匹配)和 2-解码失败(由于缺少密钥)。您可能需要使用引用的 decodeIfPresent 来进行更改以处理类型不匹配
【解决方案2】:

是的,有更好的方法

code = try values.decodeIfPresent(String.self, forKey: .code)

尽可能避免try?

【讨论】:

  • 我想看看这个声明的原因。
  • @gasher729 特别是Codable 严重依赖错误处理。几乎每个 API throws。要编写可靠的代码,最好处理错误而不是忽略它。
猜你喜欢
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2018-10-30
  • 2010-10-07
  • 1970-01-01
相关资源
最近更新 更多