You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中这段Int64自定义解码代码是否多余?

关于Swift Codable手动兼容字符串/数字类型解码的疑问

先看这段自定义的解码代码:

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)
    }
}

针对这段代码,三个疑问的解答如下:

1. 这段代码是否多余?

不多余。默认的JSONDecoder对类型匹配要求严格:如果结构体里的someId是Int64类型,JSON中对应字段必须是数字类型(比如12345),若返回的是字符串格式的数字(比如"12345"),会直接抛出解码错误。这段代码的核心作用就是兼容接口返回字段类型不一致的场景——不管是字符串还是数字格式的ID,都能解码成Int64。

2. 是否存在Int64.init(_:)能解析但JSONDecoder.decode无法处理的场景?

不存在。Int64.init(_:)能解析的都是纯数字格式的字符串(比如"123"、"-456"),但默认的JSONDecoder解码Int64类型时,只会处理JSON中的数字类型值,完全不会尝试解析字符串类型的字段。两者的处理场景没有重叠:前者是字符串到数字的类型转换,后者是JSON数字到SwiftInt64的直接解码,不存在前者能处理但后者不行的情况。

3. JSONDecoder底层是否执行相同的“解码字符串转Int64”操作?

默认情况下完全不会。JSONDecoder严格遵循JSON类型定义,解码时会检查JSON值类型与Swift结构体类型是否匹配:

  • 若JSON值是数字且能转换为Int64,则正常解码;
  • 若JSON值是字符串,哪怕内容是纯数字,只要结构体对应类型是Int64,就直接抛出解码错误。

只有通过自定义init(from:)方法(比如你贴的这段代码),或者设置JSONDecoder的自定义解码策略,才会实现跨类型的解码转换。

内容的提问来源于stack exchange,提问作者Isaaс Weisberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:45:40