Ошибка keyNotFound при разборе данных OpenWeather JSON (SwiftUI) - PullRequest
0 голосов
/ 25 апреля 2020

Мне нужно получить объект «имя» с помощью openWeather API, и мне удается проанализировать json и извлечь данные, но для его конкретных объектов, таких как «имя», я постоянно получаю эту ошибку:

keyNotFound (CodingKeys (stringValue: "name", intValue: nil), Swift.DecodingError.Context (codingPath: [], debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" name \ ", intValue : nil) (\ "name \"). ", underError: 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)
                        }
                    }
                }
            }
        }
    }
}

1 Ответ

1 голос
/ 25 апреля 2020

Ожидается, что объект WeatherData будет содержать 2 поля: name и main. Но, по-видимому, фактические данные не содержат name. Вам необходимо дважды проверить фактические данные, которые вы пытаетесь проанализировать, и обновить модель WeatherData.

...