'[ResponseData]' для ожидаемого типа аргумента 'ResponseData' - PullRequest
0 голосов
/ 22 февраля 2020

Я создаю приложение, которое извлекает данные из 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. Что я мог сделать не так? Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 22 февраля 2020

Ошибка ясна: вы используете (неправильный) 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)
    }

на (другое имя делает это понятнее)

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

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