Swift 4 - Невозможно вызвать 'encode' со списком аргументов типа '(Codable)' - PullRequest
0 голосов
/ 13 ноября 2018

Я создал набор функций 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. Но это действительно неуклюже.

1 Ответ

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

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

func encodeRequestJSON<T:Encodable>(apiRequestObject: T) throws -> Data {
    return try JSONEncoder().encode(apiRequestObject)
}
...