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

时间:2017-09-09 12:34:41

标签: swift codable

我有一个Swift应用程序,我正在转换为使用Codable协议(而不是EVReflection,它改变了很多,以至于我再也无法使其工作)。当与app服务器进行交易时,我的代码生成一个类“ServerResponse”的对象,该对象包含许多变量 - 其中一个是“responseObject” - 可以是从用户到消息的任意数量的不同对象,或者其他。因为Codable默认不使用“decodeIfPresent”,所以我在某些事务中遇到错误,并且必须覆盖init(来自解码器:解码器)以防止这种情况。现在我面临的挑战是如何确定如何保留原始JSON字符串以便稍后通过调用方法解码为正确的对象类型,或者其他类似的修复。结论:我需要responseObject灵活,并允许我的服务器选择发送的任何类型的对象。

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

1 个答案:

答案 0 :(得分:2)

你可以做类似的事情: -

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
    }
}

}

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