可编码结构中的可编码变量

时间:2018-02-14 10:43:13

标签: swift encoding encodable

我想创建一个包含可编码项字典的结构,它本身是可编码的。这是因为我不知道确切的数据结构,它将取决于连接的数据库。我试着做这样的事情:

struct UserInfo: Encodable {
    let personalInformation: [String : Encodable]
}

但它给出了一个错误,即UserInfo不符合Encodable。我认为它应该,因为它只包含可编码的项目。这可以通过某种方式轻松实现吗?

1 个答案:

答案 0 :(得分:0)

我想我找到了一个很好的解决方案来解决我的问题。

public enum JSONValue: Encodable {

    case string(String)
    case int(Int)
    case double(Double)
    case dict([String : JSONValue])
    case array([JSONValue])
    case bool(Bool)
    case null

    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        switch self {
        case .int   (let x): try? container.encode(x)
        case .double(let x): try? container.encode(x)
        case .string(let x): try? container.encode(x)
        case .dict  (let x): try? container.encode(x)
        case .array (let x): try? container.encode(x)
        case .bool  (let x): try? container.encode(x)
        case .null:          try? container.encodeNil()
        }
    }

}

struct Test: Encodable {
    let name: String
    let dict: [String : JSONValue]
}

这样我可以创建这样的对象:

let t = Test(name: "Damian", dict: ["string" : JSONValue.string("asd"), "number" : JSONValue.int(127)])
let data = try! JSONEncoder().encode(t)

print(String(data: data, encoding: .utf8)!)

并获取

{"name":"Damian","dict":{"number":127,"string":"asd"}}