【发布时间】:2020-02-10 07:21:43
【问题描述】:
我有以下对象
struct Properties: Decodable {
var id: String?
var value: String?
var color: String?
}
在对服务器的第一个请求中,我得到以下响应
{
"id":"1",
"color":"red"
}
在另一个请求之后,我得到了
{
"id":"1", // the id of the object props is meant for
"props":{
"value":"my value" // I can get any property here
}
}
在两个请求之后,我应该设置所有属性的对象
现在我将第二个请求解码如下
struct SetAttr: Decodable {
let id: String
let props: [String : Any]
enum SetAttrCodingKeys: String, CodingKey {
case id
case props
}
init(from decoder: Decoder) throws {
let container = try! decoder.container(keyedBy: SetAttrCodingKeys.self)
props = try! container.decode([String : Any].self, forKey: .props)
id = try! container.decode(String.self, forKey: .id)
}
}
但我不知道如何解析props 字典并在第一个对象上设置属性。我愿意使用解码库,但我没有找到任何可以做到这一点
编辑:
这就是我尝试从字典中设置属性的方式,但解决方案不可扩展
var myObject: Properties
properties = setAttr.props // [String:Any]
let keys = properties.keys
keys.forEach { key in
if let value = properties[key] {
switch key {
case "value":
myObject.value = value as? String
case "color":
myObject.color = value as? String
default:
break
}
}
}
【问题讨论】:
-
如果您仍然需要两个步骤来创建和填充结构,我建议使用传统的
JSONSerialization解码props请求。 -
这个解决方案真的和json有关吗?
-
@vadian 好的,但是如何将它映射到前一个对象
-
在
Properties中指定CodingKeysid和color,并使用JSONDecoder解码第一个响应。然后使用JSONSerialization解码第二个响应并更新Properties实例。