【问题标题】:SwiftUI OpenWeatherApi App show no contentSwiftUI OpenWeatherApi App 不显示内容
【发布时间】:2021-06-25 15:44:08
【问题描述】:

我是快速开发的新手,我无法让自己通过这个。我运行我的应用程序并按下“操作”按钮,我看到我的文本没有变化,应该是当前温度。它给了我一个错误“nw_protocol_get_quic_image_block_invoke dlopen libquic failed”

我的代码:




struct ContentView: View {

    @State var temp = Int()

    func CallApi(){
                
        let url = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=budapest&appid=#########################################")
                
        URLSession.shared.dataTask(with: url!){data, response, error in
            if let data = data {
                if let DecodedData = try? JSONDecoder().decode(Api.self, from: data){
                    self.temp = DecodedData.main.temp
                        }
                    }
                }.resume()
            }

struct Api: Codable, Hashable{
    
    var main: DataStructre
}

struct DataStructre: Codable, Hashable   {
    var temp: Int
}
    
  
    var body: some View {

        Text("\(temp)")
        Button("Idojaras"){CallApi()}
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

【问题讨论】:

  • 控制台消息 nw_protocol_get.... 与您的问题无关。
  • 在代码中发布 API 密钥不是一个好主意。

标签: api swiftui


【解决方案1】:

如果您使用do/try/catch 而不是try?,您可以获得有用的错误消息。

do {
    let DecodedData = try JSONDecoder().decode(Api.self, from: data)
    self.temp = DecodedData.main.temp
} catch {
    print(error)
}

在这种情况下,我得到:

解析的 JSON 编号 不适合 Int。

更改temp 的类型(在@State 变量和DataStructre 中)可以解决此问题。

一般来说,我建议将您的 JSON 粘贴到 app.quicktype.io 中,这将为您生成具有正确类型/结构的模型。


与您的问题稍微无关,但您可能希望考虑在 SwiftUI 中使用 dataTaskPublisher 和 Combine 而不是 dataTask (https://developer.apple.com/documentation/foundation/urlsession/processing_url_session_data_task_results_with_combine)。另外,Swift 中的函数名一般都是小写的。

【讨论】:

  • 这回答了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-03
  • 2014-02-14
  • 2012-09-24
  • 2020-09-06
相关资源
最近更新 更多