gpt4 book ai didi

Swift 4 - Codable - 解码时如何允许 key 的不同对象类型

转载 作者:搜寻专家 更新时间:2023-11-01 07:08:57 24 4
gpt4 key购买 nike

我有一个 Swift 应用程序,我正在将其转换为使用 Codable 协议(protocol)(而不是 EVReflection,它变化太大以至于我无法再使用它)。当与应用程序服务器进行交易时,我的代码生成一个类“ServerResponse”的对象,它包含许多变量——其中一个是“responseObject”——它可以是从用户到消息的任意数量的不同对象,或者其他。因为 Codable 默认不使用“decodeIfPresent”,所以我在某些事务中遇到错误,并且不得不重写 init(from decoder: Decoder) 来防止这种情况。现在我面临的挑战是弄清楚如何保持原始 JSON 字符串完好无损,以便稍后通过调用方法或其他类似修复方法解码为正确的对象类型。底线:我需要 responseObject 灵活并允许我的服务器选择发送的任何类型的对象。

如果有人有任何建议,我将不胜感激。如果有帮助,我很乐意分享代码,但我不认为会有帮助,因为这个问题本质上主要是概念性的。

最佳答案

你可以做类似的事情:-

struct CustomAttribute: Codable {
var attributeCode: String?
var intValue: Int?
var stringValue: String?
var stringArrayValue: [String]?

enum CodingKeys: String, CodingKey {

case attributeCode = "attribute_code"
case intValue = "value"
case stringValue
case stringArrayValue
}

init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)

attributeCode = try values.decode(String.self, forKey: .attributeCode)
if let string = try? values.decode(String.self, forKey: .intValue) {
stringValue = string
} else if let int = try? values.decode(Int.self, forKey: .intValue) {
intValue = int
} else if let intArray = try? values.decode([String].self, forKey: .intValue) {
stringArrayValue = intArray
}
}

}

这里的值可以是三种类型,我手动识别是哪种类型。

关于Swift 4 - Codable - 解码时如何允许 key 的不同对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46130772/

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