Общая функция декодирования не работает (Swift) - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь создать универсальную функцию декодирования, чтобы декодировать мои две разные модели. Я получаю сообщение об ошибке «Тип аргумента« PrivateSchoolType.Type »не соответствует ожидаемому типу« Декодируемый »».

Модель

struct PrivateSchoolModel: Decodable {
    var name: String
    var id: String
    var city: String
    var state: String
}

Функция вызова

function getInfo() {
    // does not work => ERROR
    guard let schools = decode(jsonData: jsonData, using: PrivateSchoolModel) else { return }

    // does work
    guard let schools = specificDecode()
}

Специальная функция декодирования (РАБОТАЕТ)

private func specificDecode() -> [PrivateSchoolModel]? {
    guard let jsonData = getJSONData(from: .privateSchool) else { return }
        do {
            let decoder = JSONDecoder()
            let schools = try decoder.decode([PrivateSchoolModel].self, from:
            jsonData)
            return schools

        } catch let error {
            print("Error: \(error.localizedDescription)")
        }
        return nil
}

Общая функция декодирования (НЕ РАБОТАЕТ)

private func decode<M: Decodable>(jsonData: Data, using model: M) -> [M]? {
        do {
            //here dataResponse received from a network request
            let decoder = JSONDecoder()
            let schools = try decoder.decode([M].self, from:
                jsonData) //Decode JSON Response Data

            return schools
        } catch let parsingError {
            print("Error", parsingError)
        }

        return nil
    }

1 Ответ

0 голосов
/ 07 ноября 2018

Измените метод signature, как показано ниже,

private func decode<M: Decodable>(jsonData: Data, using modelType: M.Type) -> M? {
    do {
        //here dataResponse received from a network request
        let decoder = JSONDecoder()
        let schools = try decoder.decode(modelType, from: jsonData) //Decode JSON Response Data
        return schools
    } catch let parsingError {
        print("Error", parsingError)
    }
    return nil
}

Usage

guard let schools = decode(jsonData: jsonData, using: [PublicSchoolModel].self) else { return }
...