解析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()
}