SwiftUI Загрузить один объект JSON из URL-адреса

Я пытаюсь использовать один объектный файл JSON, хранящийся на веб-сайте. Я хочу отобразить одну из переменных (место) из файла JSON в тексте внутри ZStack. Однако есть проблема с определением переменной @State spotData. Ошибка SwiftUI: «Отсутствует аргумент для параметра« от »в вызове». Любая идея, что я делаю неправильно?

import SwiftUI
import CoreLocation

struct SpotStructure: Decodable {
    
    var spot: String
    var country_code: String
    var is_weather_station: Bool
    var month: [Int]
    var day: [Int]
    var weekday: [String]
    var hour: [Int]
    var current_wind: Int
    var current_wind_direction: Int
    var wind_speed: [Int]
    var wind_gusts: [Int]
    var wind_direction: [Int]
    var wave_height: [Double]
    var wave_period: [Int]
    var wave_direction: [Int]
    var weather_icon: [String]
    var current_temperature: Int
    var temperature: [Int]
    
    private var coordinates: Coordinates
    var locationCoordinate: CLLocationCoordinate2D {
        CLLocationCoordinate2D(
            latitude: coordinates.latitude,
            longitude: coordinates.longitude)
    }

    struct Coordinates: Hashable, Codable {
        var latitude: Double
        var longitude: Double
    }
}

struct ContentView: View {
    @State var spotData = SpotStructure()
    
    func loadspotdata()  {
        if let url = URL(string: "https://raw.githubusercontent.com/Bene2907/Bene2907.github.io/master/brouwersdam.json") {
            URLSession.shared.dataTask(with: url) { data, response, error in
                if let data = data {
                    do {
                        let res = try JSONDecoder().decode(SpotStructure.self, from: data)
                        spotData = res
                    } catch let error {
                        print(error)
                    }
                }
                
            }
        }
    }

    var body: some View {
        ZStack{

            Text(spotData.spot)

        }.onAppear(perform: loadspotdata)
    }
}

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

Заранее спасибо!

Отвечает ли это на ваш вопрос? Отсутствует аргумент для параметра from в вызове - SwiftUI

koen 22.12.2020 20:28
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
1
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете инициализировать struct без указания всех значений (поскольку все переменные не являются необязательными !)

@State var spotData = SpotStructure(spot: <#T##String#>, country_code: <#T##String#>, is_weather_station: <#T##Bool#>, month: <#T##[Int]#>, day: <#T##[Int]#>, weekday: <#T##[String]#>, hour: <#T##[Int]#>, current_wind: <#T##Int#>, current_wind_direction: <#T##Int#>, wind_speed: <#T##[Int]#>, wind_gusts: <#T##[Int]#>, wind_direction: <#T##[Int]#>, wave_height: <#T##[Double]#>, wave_period: <#T##[Int]#>, wave_direction: <#T##[Int]#>, weather_icon: <#T##[String]#>, current_temperature: <#T##Int#>, temperature: <#T##[Int]#>, coordinates: <#T##Coordinates#>) 

Или измените свой struct и сделайте все переменные необязательными.

struct SpotStructure: Codable {
    var spot: String? = nil
    var country_code: String? = nil
    var is_weather_station: Bool? = nil
    var month: [Int]? = nil
    var day: [Int]? = nil
    var weekday: [String]? = nil
    var hour: [Int]? = nil
    var current_wind: Int? = nil
    var current_wind_direction: Int? = nil
    var wind_speed: [Int]? = nil
    var wind_gusts: [Int]? = nil
    var wind_direction: [Int]? = nil
    var wave_height: [Double]? = nil
    var wave_period: [Int]? = nil
    var wave_direction: [Int]? = nil
    var weather_icon: [String]? = nil
    var current_temperature: Int? = nil
    var temperature: [Int]? = nil
    
    var coordinates: Coordinates? = nil
    var locationCoordinate: CLLocationCoordinate2D? {
        CLLocationCoordinate2D(
            latitude: coordinates!.latitude,
            longitude: coordinates!.longitude)
    }
    
}

Спасибо. Работает. Искал это часами.

Benedikt 22.12.2020 20:33

Делать все необязательным — не лучшее решение.

Joakim Danielson 22.12.2020 21:33

Да, это нехорошо, но он хочет использовать пустой конструктор, я дал ему обе возможности

Ouail Bellal 23.12.2020 00:21

Другие вопросы по теме