如何在 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.self
和Array<Int>.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 的转换?