微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析json数据时返回对象为nil

如何解决解析json数据时返回对象为nil

我是swift的初学者,我在解析json数据时有一个线程,对象结果为nil,谁能帮我找出问题所在。如果func返回void,我可以获得正确的数据,但我不能将它作为数组返回。谢谢

struct catalogobject: Hashable,Decodable,encodable{
    let objects: [Catalogobject]?
}

func getCatalog() -> [Catalogobject] {
    var object : [Catalogobject]!
     let url = URL(string: "https://connect.squareupsandBox.com/v2/catalog/list")!
     var request = URLRequest(url: url)
            request.httpMethod = "GET"
            request.addValue("Bearer \(token)",forHTTPHeaderField: "Authorization")
            request.addValue("\(content_type)",forHTTPHeaderField: "Content-Type")
            request.addValue("\(square_version)",forHTTPHeaderField: "Square-Version")
    URLSession.shared.dataTask(with: request) { data,res,error in
        let data = data!
        do {            
            let catalogdata =  try JSONDecoder().decode(catalogobject.self,from: data)
            object = catalogdata.objects
            print("object \(object)")
        }catch{
            print(error)
        }        
      }.resume()
    return object
}

解决方法

网络请求是一个异步任务,您应该使用完成块返回数据,而不是通过这种方式返回对象。 在您的代码中,函数体在网络调用完成其任务之前执行并返回。

关于您应该如何做的示例指南:

func getCatalog(_ completion: @escaping ([CatalogObject]) -> ()) {
      let url = URL(string: "https://connect.squareupsandbox.com/v2/catalog/list")!
     var request = URLRequest(url: url)
            request.httpMethod = "GET"
            request.addValue("Bearer \(token)",forHTTPHeaderField: "Authorization")
            request.addValue("\(content_type)",forHTTPHeaderField: "Content-Type")
            request.addValue("\(square_version)",forHTTPHeaderField: "Square-Version")
    URLSession.shared.dataTask(with: request) { data,res,error in
        let data = data!
        do {            
            let catalogdata =  try JSONDecoder().decode(catalogobject.self,from: data)
            completion(catalogdata.objects)
            print("object \(object)")
        }catch{
            print(error)
        }        
      }.resume()
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。