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

时间:2017-07-01 04:28:15

标签: swift codable

这是我的代码。但我不知道该如何设定价值。它必须手动完成,因为实际结构比这个例子稍微复杂一些。

请帮忙吗?

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

4 个答案:

答案 0 :(得分:24)

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

解码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

答案 1 :(得分:4)

感谢Joshua Nozzi的暗示。这是我实现解码Int:

数组的方法
let decoder = JSONDecoder()
let intArray = try? decoder.decode([Int].self, from: data)

无需手动解码。

答案 2 :(得分:1)

Swift 5.1

就我而言,this answer很有帮助

我有一个 JSON 格式: @Controller @RequestMapping("/ui/foo") public class FooController { @RequestMapping(method = RequestMethod.GET) // You can use @GetMapping public ModelView homePage(Model model) { // set model attributes return "home"; // this will be mapped to home view jsp/thyme/html } }

因此,您无需按键即可解码数据

"[ "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
    }
}

答案 3 :(得分:0)

或者您也可以通用:

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