我在网上看到过一段代码,它使用Swift Coble Do将JSON解码为 struct .

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    if let stringValue = try? container.decode(String.self, forKey: .someId), let value = Int64(stringValue) {
        someId = value
    } else {
        someId = try container.decode(Int64.self, forKey: .someId)
    }
}

此代码:

  • 对字符串进行解码
  • try 将其解析为Int64
  • 如果失败-它会直接try 对Int64进行解码

我的问题是--这个代码是多余的吗?

有没有可能String中的Int64.init(_:)能够破译出JSONDecoder.decode不能破译的东西?

实际上,这不就是JSONDecoder在幕后所做的事情吗?

推荐答案

这并不是多余的.它可用于处理有时将数字编码为字符串(在引号内),有时仅编码为数字的JSON.

例如,JSON有时可能是:

{
    "someId": "12345"
}

在这种情况下,您需要解码到String,然后解码到Int64.init

有时,JSON可能是:

{
    "someId": 12345
}

在这种情况下,解码到String将失败,您可以直接解码到Int64.

Swift相关问答推荐

通过withstickedContinuation传递通用类型T

多个提取来计算核心数据中的记录

Swift C外部实现的Task / Future类类型

在visionOS 1.0中已弃用';base Color';:请改用`Color`属性

在Swift中,将秒设置为0也等于将1添加到分钟

如何在SwiftUI的文本视图中显示NSMutableAttributedString?

使用索引来访问 libc 定义的元组

ForEach within List:模式的好处?

SwiftUI:当 currentIndex 值更改时,数组中的第 n 个视图是否已换出?

如何在 SwiftUI 中获取视图的位置

SwiftUI:决定键盘重叠的内容

如何以快速 Select 器菜单样式调整图像大小

如何仅将 SwiftUI 不透明度应用于父视图?

Swift:连接两个数组而不重复共享后缀/前缀

如何自己快速编写 Hashable 协议

在 Swift 中返回实例类型

如何在 GCD 中停止 DispatchWorkItem?

如何交换快速数组中的元素?

如何快速将弹出框调整为表格视图中内容的大小?

Swift 中的单元测试致命错误