0

我需要使用 openWeather API 检索“名称”对象,并且我设法解析 json 并检索数据,但是对于其特定对象,例如“名称”,我经常收到此错误:

keyNotFound(CodingKeys(stringValue: "name", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"name\", intValue: nil) (\ “名称\”)。”,基础错误:无))

需要帮助来解决这个问题。谢谢。

这是我的代码(在 3 个文件中):

//----------------------WeatherBrain File------------------------------

import Foundation
import SwiftUI

class ClimaBrain : ObservableObject {
    @Published var textFieldValue = ""
    @Published var urlString = ""
    @Published var weatherURL = "https://api.openweathermap.org/data/2.5/find?APPID=03c40ac21db250c8d1ce3aba0bf32c89&q="


    func performRequest(urlString: String){
        if let url = URL(string: urlString){
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url) { (data, response, error) in
                if error != nil{
                    print(error!)
                    return
                }
                if let safeData = data{
                    self.parseJSON(weatherData: safeData)

                }
            }
            task.resume()
        }
    }


    func parseJSON(weatherData : Data){
        let decoder = JSONDecoder()
        do{
            let decodedData = try decoder.decode(WeatherData.self, from: weatherData)
            print("Brain Parse Data: \(decodedData.name)")
        } catch{
            print(error)
        }
    }


    func fetchWeather()  {
        urlString = "\(weatherURL)\(textFieldValue)&units=metric&"
        performRequest(urlString: urlString)
    }


    func endEditing() {
        UIApplication.shared.endEditing()
        self.fetchWeather()
    }

}


//----------------------WeatherData File------------------------------

import Foundation

struct WeatherData: Decodable {
    let name : String
    let main: Main
}


struct Main: Decodable {
    let temp: Double
}


//----------------------ContentView File------------------------------

import Foundation
import SwiftUI

struct ContentView: View {

    @ObservedObject var climaBrain = ClimaBrain()

    var body: some View {
        ZStack{
            Image("light_background")
                .resizable()
                .scaledToFill()
                .edgesIgnoringSafeArea(.all)
            VStack{
                HStack{

                    TextField("Search", text: $climaBrain.textFieldValue){
                        self.climaBrain.endEditing()
                        print("Return Key:  \(self.climaBrain.urlString)")
                    }
                    .keyboardType(.default)
                    .font(Font.custom("Halvetica", size: 30))
                    .frame(width: 200, height: 60, alignment: .center)
                    .padding(10)
                    VStack{
                        Button(action: {
                            self.climaBrain.endEditing()
                            print("Icon Button: \(self.climaBrain.urlString)")
                        }) {
                            Image(systemName: "magnifyingglass")
                                .renderingMode(.original)
                                .resizable()
                                .scaledToFit()
                                .frame(width: 50, height: 50, alignment: .center)
                        }
                    }
                }
            }
        }
    }
}
4

1 回答 1

1

您期望一个WeatherData对象包含 2 个字段:namemain. 但显然,实际数据不包含name. 您需要仔细检查您尝试解析和更新WeatherData模型的实际数据。

于 2020-04-25T17:30:13.857 回答