在 SwiftUI 上迭代 JSON 数组(使用 SwiftyJson 解析)
Posted
技术标签:
【中文标题】在 SwiftUI 上迭代 JSON 数组(使用 SwiftyJson 解析)【英文标题】:Iterate over a JSON array (parsed with SwiftyJson) on SwiftUI 【发布时间】:2021-03-21 20:41:08 【问题描述】:我在尝试迭代 JSON 数组(使用 SwiftyJson 解析)以为每个项目创建 VStack(它们是具有水平滚动的 HStack 的一部分)时遇到问题。 JSON 数组填充得很好,但我从不对其进行迭代我总是会收到错误“包含控制流语句的闭包不能与函数生成器'ViewBuilder'一起使用”。
我正在学习 SwiftUI,我正在学习这个。
这是我的代码:
struct ContentView: View
@State var city = ""
@State var hourly_weathers:[JSON] = []
var body: some View
Text("\(city)")
.onAppear(perform:
getData()
)
for hw in hourly_weathers
VStack(alignment: .leading, spacing: 15)
Text("\(hw.temp)")
func getData()
.....
self.city = json["currently_weather"]["city"].stringValue
self.hourly_weathers = json["hourly_weathers"].arrayValue
我尝试使用 ForEach(已在 cmets 中建议)但我收到此错误“通用结构 'ForEach' 要求 'JSON' 符合 'Hashable'”
ForEach(hourly_weathers, id: \.self) hw in
Text(hw["interval"].stringValue)
谢谢
【问题讨论】:
查找 SwiftUI 的ForEach
什么是城市?在我看来,您似乎在 body 属性中添加了 getData() 函数,而且您从 body 返回了两种不同的类型,这是您不应该做的。此外,for 应该是 forEach。
@TusharSharma 感谢您的回复。我编辑了我的问题,包括缺少的信息。我试过 ForEach 有其他用户建议,但仍然没有工作。
【参考方案1】:
我解决了这个问题,创建了一个 Dictionary 并将 JSON 数组的每一项附加到它上面。
这是代码:
struct HourlyWeather: Identifiable, Decodable
var id = UUID()
var interval: String
@State var hourly_weathers_array = [HourlyWeather]()
ForEach(hourly_weathers_array) hw in
Text(hw.interval)
func getData()
...
for hw in json["hourly_weathers"].arrayValue
let hwObj = HourlyWeather(interval: hw["interval"].string ?? "00:00")
hourly_weathers_array.append(hwObj)
之后,您可以使用 ForEach 迭代新 Dictionary 并创建视图。
谢谢
【讨论】:
以上是关于在 SwiftUI 上迭代 JSON 数组(使用 SwiftyJson 解析)的主要内容,如果未能解决你的问题,请参考以下文章
预期解码 Dictionary<String, Any> 但找到一个数组而不是 JSON SwiftUI
检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)