如何映射 json 响应并创建带有索引的简单列表
Posted
技术标签:
【中文标题】如何映射 json 响应并创建带有索引的简单列表【英文标题】:How to map json response and create simple list with indexes 【发布时间】:2017-11-01 19:44:30 【问题描述】:我正在获取成分,从响应中准备值,并且我希望此文本在屏幕上显示时呈现中断、破折号和指针。我怎样才能做到这一点?
if let ingredients = dict["ingredients"] as? Array<String>
self._ingredients = ingredients.joined(separator: " \n - ")
这有效,但不适用于数组中的第一个元素。
4 elements
- 0 : "3 glasses of flour"
- 1 : "1 spoon of salt"
- 2 : "spices"
- 3 : "1 glass of hot water"
我想让它在 ViewController 的标签上显示,如下所示:
- 3 glasses of flour
- 1 spoon of salt
- spices
- 1 glass of hot water
为了准备我想添加适当的数字指针:
if let preparing = dict["preparing"] as? Array<String>
self._preparing = preparing.joined(separator: "\n")
3 elements
- 0 : "Mix dry ingredients."
- 1 : "Add hot water, oil, sugar to yeast."
- 2 : "When it's ready add this to flour and start combining"
所以它在标签中看起来像这样:
1. Mix dry ingredients
2. Add hot water, oil and sugar to yeast
3. When it's ready add this to flour and start combining
其他信息 Screen 目前的外观(不要介意语言,它是波兰语)。
在这个 Controller 的生命周期中,我做了简单的 updateUI
func updateUI ()
pizzaDesc.text = pizza.description
ingredientsDesc.text = pizza.ingredients
PreparingDesc.text = pizza.preparings
titleLbl.text = pizza.title
//MARK: Lifecycle
override func viewDidLoad()
super.viewDidLoad()
hideTestDataOnLoad()
pizza = PizzaRecipe()
pizza.downloadRecipeDetails
self.updateUI()
【问题讨论】:
你能发一张它目前看起来的屏幕截图吗?目前的状态有点模棱两可。您还可以发布生成您分配给标签的全文的代码吗? @Frankie 我已经用其他信息和图片更新了我的问题。我会尝试用已经给出的答案来解决这个问题。 【参考方案1】:用这个dict
测试:
let jsonText = """
"ingredients": [
"3 glasses of flour",
"1 spoon of salt",
"spices",
"1 glass of hot water"
],
"preparing": [
"Mix dry ingredients.",
"Add hot water, oil, sugar to yeast.",
"When it's ready add this to flour and start combining"
]
"""
let dict = try! JSONSerialization.jsonObject(with: jsonText.data(using:.utf8)!) as! [String: Any]
案例 1:-
可能不是 separator
。
if let ingredients = dict["ingredients"] as? Array<String>
self._ingredients = ingredients.map" - \($0)".joined(separator: "\n")
//...
案例 2:您可以使用 enumerated()
获取与每个元素配对的元素索引。
if let preparing = dict["preparing"] as? Array<String>
self._preparing = preparing.enumerated().map"\($0+1). \($1)".joined(separator: "\n")
//...
【讨论】:
【参考方案2】:所以这令人困惑的原因是您实际上要在这里完成两件不同的事情:
-
您想在每种成分前加上一个破折号(- 3 个鸡蛋)
您希望数组中的每一项都位于不同的行中
您遇到的问题是 joined
仅适用于数组中的 BETWEEN 项目,而不适用于每个项目。您需要使用 .map()
对数组中的每个项目执行某些操作(将其视为 for 循环)。
所以你会这样实现:
let prefixed = ingredients.map() "- " + $0
let joined = prefixed.joined(separator: " \n")
label.text = joined
【讨论】:
以上是关于如何映射 json 响应并创建带有索引的简单列表的主要内容,如果未能解决你的问题,请参考以下文章