从 URL 下载嵌套 JSON 并制作 Observable Object SwiftUI,错误:“在调用中缺少参数 'from' 的参数”

Posted

技术标签:

【中文标题】从 URL 下载嵌套 JSON 并制作 Observable Object SwiftUI,错误:“在调用中缺少参数 \'from\' 的参数”【英文标题】:Download nested JSON from URL and make Observable Object SwiftUI, ERROR: "Missing Argument for parameter 'from' in call"从 URL 下载嵌套 JSON 并制作 Observable Object SwiftUI,错误:“在调用中缺少参数 'from' 的参数” 【发布时间】:2021-01-17 14:35:03 【问题描述】:

我正在尝试从 URL 下载嵌套的 JSON 文件。我想让它成为可观察对象,以便我的应用程序在下载完成后更新其视图。 在这里,我有我的结构和我创建的类,以使其成为可观察对象。这也是我的错误出现的地方:“调用中的参数'from'中缺少参数”:(感谢您的帮助!)

struct SpotDetail: Codable 
    
    var spot: String
    var day0: DayDetail
    var day1: DayDetail
    var day2: DayDetail
    
    enum CodingKeys: String, CodingKey 
        case spot = "spot"
        case day0 = "day0"
        case day1 = "day1"
        case day2 = "day2"
    


struct DayDetail: Codable 
    var date: String
    var wind: [Int]
    var gust: [Int]
    
    enum CodingKeys: String, CodingKey 
        case date = "date"
        case wind = "wind"
        case gust = "gust"
        
    


class networkSpotData: ObservableObject 
    let objectWillChange = ObjectWillChangePublisher()
    
    var WindSpot = SpotDetail()  // ERROR: "Missing Argument for parameter 'from' in call"
        willSet 
            self.objectWillChange.send()
        
    


以及从网址下载的功能:

extension ContentView 

    func loadspotdata(url: String)  
        guard let url = URL(string: "https://raw.githubusercontent.com/Bene2907/Bene2907.github.io/main/template.json") else 
            return
        
        
        let request = URLRequest(url: url)
        URLSession.shared.dataTask(with: request)  data, response, error in
            
            if let data = data 
                if let response_obj = try? JSONDecoder().decode(SpotDetail.self, from: data) 
                    
                    DispatchQueue.main.async 
                        spotData.WindSpot = response_obj
                    
                
            
            
        .resume()
    
    

终于有我的观点来呈现数据了:

struct ContentView: View 
    
    @ObservedObject var spotData = networkSpotData()
    
    var body: some View 
        VStack 
            Text("\(spotData.WindSpot.spot)")
                .padding()
            
            Text("\(spotData.WindSpot.day0.date)")
                .padding()
        .onAppear(perform: 
            loadspotdata()
        )
        
    

【问题讨论】:

【参考方案1】:

在中使用默认构造函数

var WindSpot = SpotDetail()  // ERROR: "Missing Argument for parameter 'from' in call"

你必须用SpotDetail中的默认值初始化属性,比如

struct SpotDetail: Codable 
    
    var spot: String = ""
    var day0: DayDetail = DayDetail() // this also should be initialised properties

    ...    

【讨论】:

以上是关于从 URL 下载嵌套 JSON 并制作 Observable Object SwiftUI,错误:“在调用中缺少参数 'from' 的参数”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 从 URL 读取嵌套 JSON

使用 JSON 制作 XmlHttpRequest POST [重复]

从 JSON url 下载图像不起作用。 [关闭]

将嵌套对象的JSON转换为Pandas Dataframe

遍历嵌套的 JSON 对象并使用 Python 获取值

从 URL 下载音频文件并在 iOS 应用程序中播放