gpt4 book ai didi

swift - 是否可以在不显式解码的情况下使用 Codable 子类?

转载 作者:行者123 更新时间:2023-11-28 10:30:28 25 4
gpt4 key购买 nike

我曾多次使用 struct MyThing:Codable { } 来解析 JSON。现在我想使用 class 而不是 struct,因为 struct 并不适合我需要完成的工作(可变性、一致性等),以及一些子类化。我试过这个:

class Beverage:Codable{
var name:String = ""
}
class Beer:Beverage{
var alcoholPercent:Double = 0
}

我不一定会在同一个列表中收到多种不同类型饮料的列表,假设我只想解码[Beer] 列表。如果我尝试使用带有单一啤酒的 json,例如 {"name": "Hansa", "alcoholPercent": 5.4} 并尝试将其解码为 Beer 类,如下所示:

let beer = try! JSONDecoder().decode(Beer.self, from: json.data(using: .utf8)!)

beer 将有 name: HansaalcoholPercent: 0.0。名称是正确的,但 alcoholPercent 是类中的默认值。

有没有一种神奇的方法可以让子类自动符合 Codable 而无需显式设置每个变量的键/值?

有效:

class Beverage:Codable{
var name:String = ""
}
class Beer:Beverage{
var alcoholPercent:Double = 0

enum CodingKeys:String, CodingKey{
case alcoholPercent
}

required init(from decoder: Decoder) throws {
let values = try! decoder.container(keyedBy: CodingKeys.self)
self.alcoholPercent = try! values.decode(Double.self, forKey: .alcoholPercent)
try super.init(from: decoder)
}
}

使用此代码,我得到了 “Hansa”5.4。为什么我必须为子类明确遵守 Codable 而不是为基类工作?有没有办法在没有所有手动代码的情况下做到这一点?我觉得这应该是开箱即用的,不需要所需的初始化。

最佳答案

您要求的是 Beerinit(from:) 覆盖的编译器合成。 swift 不会那样做。这已在 Swift 论坛上讨论过,例如 in this thread . Itai Ferber 是负责 Codable 设计和实现的主要 Apple 工程师,因此您可以认为他的回答具有权威性。

如果您从 Beverage 中删除 Codable 一致性并将其直接添加到 Beer(以及 Beverage 的任何其他叶子类) ) 那么你可能会得到你想要的行为。不过,这仅在您不需要 Beverage 本身的一致性时才有效。

关于swift - 是否可以在不显式解码的情况下使用 Codable 子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347273/

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