我想创建一个结构,该结构将包含可编码项目的字典,并且本身是可编码的。这是因为我不知道确切的数据结构,它取决于连接的数据库。我试图做这样的事情:
struct UserInfo: Encodable {
let personalInformation: [String : Encodable]
}
但它给出了一个错误,即 UserInfo 不符合 Encodable。我认为它应该,因为它只会包含可编码的项目。这可以以某种方式轻松实现吗?
我想我已经为我的问题找到了一个足够好的解决方案。
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"}}