首页 > 解决方案 > '[ResponseData]' 到预期的参数类型'ResponseData'

问题描述

我正在创建一个从 API 获取数据的应用程序。我在一个单独的类中创建了“API 调用”,因此我可以多次使用同一个调用。但它并没有像我期望的那样返回值。

在 ViewController A

    let data = JsonData.init()
    data.downloadJsonData(urlString: urlString) { (responseArray) in
        dataArray.append(responseArray)
        print(self.dataArray)
    }

我在以下位置收到错误dataArray.append(responseArray)

无法将类型“[ResponseData]”的值转换为预期的参数类型“ResponseData”

在 JsonData 类中

class JsonData{
    var dataArray:[ResponseData] = []

    func downloadJsonData(urlString: String, completed: @escaping (Array<ResponseData>) -> ()){

        guard let url = URL(string: urlString) else {return}

        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else{
                return
            }
            do{
                self.dataArray = [try JSONDecoder().decode(ResponseData.self, from: data)]

                //Complete task in background
                DispatchQueue.main.async {
                    completed(self.dataArray)
                }
            }
            catch let jsonErr{
                print(jsonErr)
            }
        }.resume()
    }
}

我认为问题出在:

DispatchQueue.main.async{
    completed(self.dataArray)
}

因此,一旦从 API 获取数据,我想将数组返回到正确的类。我做错了什么?任何帮助将非常感激。

标签: iosswiftapi

解决方案


错误很明显:您正在使用(错误的)API 来附加单个元素

代替

dataArray.append(responseArray)

self.dataArray.append(contentsOf: responseArray)

边注:

设置并稍后再次附加项目没有意义。使用局部变量。

代替

self.dataArray = [try JSONDecoder().decode(ResponseData.self, from: data)]

    //Complete task in background
    DispatchQueue.main.async {
        completed(self.dataArray)
    }

with (不同的名字更清楚)

let result = try JSONDecoder().decode(ResponseData.self, from: data)

    //Complete task in background
    DispatchQueue.main.async {
         completed([result])
    }

推荐阅读