gpt4 book ai didi

swift - 使枚举(具有关联类型)可编码,成功

转载 作者:IT王子 更新时间:2023-10-29 05:53:13 40 4
gpt4 key购买 nike

我无法正确解码我的 Codable 类型。我已经阅读了一些关于制作具有关联类型的 Codable 枚举的教程。我已经搜索了拼写错误、名称不匹配或其他任何内容,但我找不到任何问题。然而,每当我尝试对这些结构进行解码时(层......这在扩展中的层上定义了一个“属性”......但层的所有其他预定义部分都被正确编码/解码),我点击decode(from decoder:) 方法中的“未找到 key ”异常。

extension Layer {

struct Attribute: Codable {

enum Value: Codable {

case pulse(Double)
case flash(Double)
case draw(Double)

private enum CodingKeys: String, CodingKey {
case pulse, flash, draw
}

func encode(to encoder: Encoder) throws {

var container = encoder.container(keyedBy: CodingKeys.self)

switch self {
case .pulse(let value):
try container.encode(value, forKey: .pulse)
case .flash(let value):
try container.encode(value, forKey: .flash)
case .draw(let value):
try container.encode(value, forKey: .draw)
}
}

init(from decoder: Decoder) throws {

let values = try decoder.container(keyedBy: CodingKeys.self)

do {
let value = try values.decode(Double.self, forKey: .pulse)
self = .pulse(value)
} catch (let error) {
print(error)
}

do {
let value = try values.decode(Double.self, forKey: .draw)
self = .draw(value)
} catch (let error) {
print(error)
}

do {
let value = try values.decode(Double.self, forKey: .flash)
self = .flash(value)
} catch (let error) {
print(error)
}

self = .draw(0.0)
}


}

var value: Value

init(value: Value) {
self.value = value
}
}
}

最佳答案

我认为在解码之前,您应该首先检查解码器容器中是否存在 key 。目前,您正在这样做:

do {
let value = try values.decode(Double.self, forKey: .pulse)
self = .pulse(value)
} catch (let error) {
print(error)
}

do {
let value = try values.decode(Double.self, forKey: .draw)
self = .draw(value)
} catch (let error) {
print(error)
}

do {
let value = try values.decode(Double.self, forKey: .flash)
self = .flash(value)
} catch (let error) {
print(error)
}

解码器容器不可能包含所有三个 key ,不是吗?

因此,在解码之前检查:

if values.contains(.pulse) {
do {
let value = try values.decode(Double.self, forKey: .pulse)
self = .pulse(value)
return // remember to return here, so you don't set self back to .draw(0.0) again!
} catch (let error) {
print(error)
}
} else if values.contains(.draw) {
do {
let value = try values.decode(Double.self, forKey: .draw)
self = .draw(value)
return
} catch (let error) {
print(error)
}
} else if values.contains(.flash) {
do {
let value = try values.decode(Double.self, forKey: .flash)
self = .flash(value)
return
} catch (let error) {
print(error)
}
}

关于swift - 使枚举(具有关联类型)可编码,成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786573/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com