【发布时间】:2019-07-28 02:29:33
【问题描述】:
我正在使用以下模型解码对象
struct ACDeviceLastData {
var DA: ACDeviceLastDataBody = ACDeviceLastDataBody()
}
struct ACDeviceLastDataBody {
var amOn: Bool = false
var enabledZones: [Int] = []
var fanSpeed: Int = 0
var mode: Int = 0
var tempTarget: Float = 0.00
}
extension ACDeviceLastData: Decodable {
init(from decoder: Decoder) throws {
//Create Container
let container = try decoder.container(keyedBy: ACDeviceCodingKeys.self)
//Decode Data
DA = try container.decodeIfPresent(ACDeviceLastDataBody.self, forKey: .DA) ?? ACDeviceLastDataBody()
}
}
extension ACDeviceLastDataBody: Decodable {
init(from decoder: Decoder) throws {
//Create Container
let container = try decoder.container(keyedBy: ACDeviceCodingKeys.self)
//Decode Data
amOn = try container.decodeIfPresent(Bool.self, forKey: .amOn) ?? false
enabledZones = try container.decodeIfPresent([Int].self, forKey: .enabledZones) ?? []
fanSpeed = try container.decodeIfPresent(Int.self, forKey: .fanSpeed) ?? 0
mode = try container.decodeIfPresent(Int.self, forKey: .mode) ?? 0
tempTarget = try container.decodeIfPresent(Float.self, forKey: .tempTarget) ?? 0.00
}
}
这样做的问题是DA 的值并不总是相同的类型。它有时可以是整数数组的格式,有时可以是 ACDevieLastDataBody 的格式。我试过做一个 do-try-catch ,但不知道如何让它发挥作用(如果这甚至是正确的做法)
我的问题是,当它是一个整数数组时,我将如何在没有解码器抛出的情况下解码它们。非常感谢任何帮助。提前谢谢你。
【问题讨论】:
-
捕获
init方法中的类型不匹配错误,如果发生则解码其他类型。或者使用具有关联类型的枚举来区分情况。 -
@vadian 感谢您的建议。您是否有机会为我发布一个示例,因为我不能 100% 确定您将如何实施?
-
这个问题已经问过了a couple of times