如何使用 Swift Codable 手动解码数组?

问题描述 投票:0回答:4

我不知道在下面的代码中该设置什么值。它必须手动完成,因为实际结构比这个示例稍微复杂一些。

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?
   }
}
swift codable
4个回答
41
投票

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

解码

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


11
投票

感谢约书亚·诺齐的提示。以下是我如何实现解码 Int 数组:

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

无需手动解码。


6
投票

斯威夫特 5.1

就我而言,这个答案非常有帮助

我有一个 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)

1
投票

或者你可以通用:

let decoder = JSONDecoder()
let intArray:[Int] = try? decoder.decode(T.self, from: data) 
© www.soinside.com 2019 - 2024. All rights reserved.