Swift 4 - невозможно вызвать 'encode' со списком аргументов типа '(Codable)'

Я создал набор функций API, которые кодируют объект (используя Struct, который соответствует Codable), затем отправляет полученный объект данных JSON на сервер, а затем декодирует ответ JSON. Все работает нормально - особенно доволен новым методом парсинга JSON в Swift 4.2. Однако теперь я хочу провести рефакторинг кода, чтобы можно было повторно использовать код для различных вызовов методов - когда я это делаю, я получаю действительно досадную ошибку.

func encodeRequestJSON(apiRequestObject: Codable) -> Data {
    do {
        let encoder = JSONEncoder()
        let jsonData = try encoder.encode(apiRequestObject)
        let jsonString = String(data: jsonData, encoding: .utf8)
        print(jsonString)
    } catch {
        print("Unexpected error")
        }
    return jsonData!
}

Это сообщение об ошибке:

Cannot invoke 'encode' with an argument list of type '(Codable)'

Я попытался изменить тип с Codable на Encodable, но получил ту же ошибку, за исключением типа (Encodable) в сообщении. Любой совет? Мой запасной вариант - закодировать данные в текущем ViewController, затем вызвать функцию HTTPPost и затем декодировать обратно в VC. Но это действительно неуклюже.


person MarkCoolski    schedule 13.11.2018    source источник
comment
При использовании Codable необходимо указать точный тип. Вы не можете обобщить это с помощью протокола как типа.   -  person PGDev    schedule 13.11.2018
comment
Обратите внимание: если вы нажмете на дополнительную информацию об ошибке, вы должны получить 1. Expected an argument list of type '(T)', что может быть связано с ответом Давида Пастора.   -  person Larme    schedule 13.11.2018


Ответы (1)


Вам нужен конкретный тип, который нужно передать в JSONEncoder.encode, поэтому вам нужно сделать вашу функцию универсальной с ограничением типа на Encodable (Codable не требуется, это слишком строго).

func encodeRequestJSON<T:Encodable>(apiRequestObject: T) throws -> Data {
    return try JSONEncoder().encode(apiRequestObject)
}
person Dávid Pásztor    schedule 13.11.2018