【发布时间】:2020-07-21 22:27:43
【问题描述】:
我想听听你的一些建议。我想通过从 API 获取的动态响应创建 dictionary,并在 Alamofire POST 请求中发送该字典。
从我目前的情况来看,它正在工作,但我对我所做的并不满意,我认为代码真的很乱。
这是我可以收到的示例
"content": {
"type": "form",
"fields": [
{
"type": "select",
"label": "Do you have your documents?",
"field": "user.has_docs",
"default": 0,
"choices": [
{
"value": 0,
"name": "Not yet"
},
{
"value": 1,
"name": "I do"
}
]
},
{
"type": "input",
"field": "user.date",
"label": "When do you arrive?",
}
]
}
使用Codable协议解析json后,我的所有数据都在模型Field中
- 类型:字符串
- 标签:字符串
- 字段:字符串
- 默认值:整数?
- 选择:[选择]?
Choice
- 值:整数
- 名称:字符串
所以我想创建我的字典,我想要以下方案:
{
"value": {
"user": {
"has_docs": 1,
"date": "29/07/2020"
}
}
}
名为 : "value" 的键始终是相同的值,但另一个取决于 API 的结果。 “父对象”对应的字段前缀,右边是子对象。
在 Swift 中硬编码字典并不难,我会这样做
let dict = [
"value": [
"user": [
"has_docs": 1,
"date": "29/07/2020"
]
]
]
但是麻烦开始了,尝试动态创建字典。 user 中的值只保留最后一个,并将 has_docs 替换为 date。
我找到了使用 flatmap 和 reduce 的解决方法,但它只允许类型 [String: String],不幸的是我还需要在字典中写入 [String: Int]。
这里是代码示例
let flattenedDictionary = [key : dictionaries
.flatMap { $0 }
.reduce([String:String]()) { (dict, tuple) in
var nextDict = dict
nextDict.updateValue(tuple.1 as! String, forKey: tuple.0)
return nextDict
}]
parameters["value"] = flattenedDictionary
这里: 键=“用户”。 字典 = [["has_docs": 1], ["date": "29/07/2020"]]
如果您需要更多信息,请随时交流
如果您对如何帮助我有任何线索,我将不胜感激,感谢您到目前为止的阅读。
我希望我很容易理解。
编辑
从总体上看:我想动态创建字典
[String: [String: [String: Any]]]
【问题讨论】:
-
我不知道第一个 JSON 和
Field模型与第二个value/user/has_docsJSON 的关系如何...你能澄清一下两者的关系吗相关? -
当然,
Field是我从第一个 JSON 中解析出来的,它允许我使用这些值。关于第二个 JSON,这就是我将在Alamofire请求中发送的内容。所以,value键永远不会改变。因为第一个 JSON 有一个field键,所以我得到了前缀,这就是我有user和field后缀 (has_docs) 在user内的方式。这就是它的关系, -
我明白了。所以问题根本不在于第一个 JSON。您只想根据某些东西动态地创建字典(对于这个问题而言,那是什么东西无关紧要),对吗?这个字典应该是
[String: [String: [String: Any]]]吗? -
没错!让我编辑帖子
-
那么,创建它有什么问题? (实际上,是
[String: String: [String:Any]]]还是少一级:[String: [String: Any]],正如您的静态代码所暗示的那样)
标签: json swift dictionary optimization alamofire