在 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 解析)的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 形状导致反向数组访问

预期解码 Dictionary<String, Any> 但找到一个数组而不是 JSON SwiftUI

检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)

在 SwiftUI 列表中显示 JSON 字典

编写 SwiftUI 模型以从带有数组的 JSON 文件中读取

如何在 REACT JS API 调用中迭代 JSON 嵌套数组?