如何在 swift 4 Codable 中手动解码数组?

Posted

技术标签:

【中文标题】如何在 swift 4 Codable 中手动解码数组?【英文标题】:How to manually decode an an array in swift 4 Codable? 【发布时间】:2017-12-05 01:19:30 【问题描述】:

这是我的代码。但我不知道将值设置为什么。必须手动完成,因为实际结构比这个例子稍微复杂一些。

有什么帮助吗?

struct Something: Decodable 
   value: [Int]

   enum CodingKeys: String, CodingKeys 
      case value
   

   init (from decoder :Decoder) 
      let container = try decoder.container(keyedBy: CodingKeys.self)
      value = ??? // < --- what do i put here?
   

【问题讨论】:

【参考方案1】:

由于一些错误/拼写错误,您的代码无法编译。

解码Int写数组

struct Something: Decodable 
    var value: [Int]

    enum CodingKeys: String, CodingKey 
        case value
    

    init (from decoder :Decoder) throws 
        let container = try decoder.container(keyedBy: CodingKeys.self)
        value = try container.decode([Int].self, forKey: .value)
    


但如果问题中的示例代码代表整个结构,则可以简化为

struct Something: Decodable 
    let value: [Int]

因为可以推断出初始化程序和CodingKeys

【讨论】:

谢谢.. 我正在尝试[Int.self]。没有意识到.self 必须在外面 我相信你也可以只指定Array.selfArray&lt;Int&gt;.self(例如[Int].self)将从value 声明的类型中推断出来。【参考方案2】:

感谢 Joshua Nozzi 的提示。以下是我如何实现对 Int 数组进行解码:

let decoder = JSONDecoder()
let intArray = try? decoder.decode([Int].self, from: data)

无需手动解码。

【讨论】:

【参考方案3】:

或者你可以通用:

let decoder = JSONDecoder()
let intArray:[Int] = try? decoder.decode(T.self, from: data) 

【讨论】:

【参考方案4】:

斯威夫特 5.1

就我而言,this answer 非常有帮助

我有一个 JSON,格式为:"[ "5243.1659 EOS" ]"

因此,您可以在没有密钥的情况下解码数据

struct Model: Decodable 
    let values: [Int]

    init(from decoder: Decoder) throws 
        var container = try decoder.unkeyedContainer()
        let values = try container.decode([Int].self)
        self.values = values
    

let decoder = JSONDecoder()
let result = try decoder.decode(Model.self, from: data)

【讨论】:

以上是关于如何在 swift 4 Codable 中手动解码数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Core Data 中使用 swift 4 Codable?

如何在 Core Data 中使用 swift 4 Codable?

使用 Swift 4 的 Codable 进行解码时,是啥阻止了我从 String 到 Int 的转换?

Swift 4 可编码;如何使用单个根级密钥解码对象

使用 swift Codable 以值作为键来解码 JSON

Swift Codable - 如何编码和解码字符串化的 JSON 值?