Невозможно вызвать «декодирование» со списком аргументов типа «(Декодируемый, из: данных)»

У меня есть следующий пример кода на игровой площадке. Я хочу декодировать результат сетевого запроса, если этот результат соответствует протоколу Decodable.

Любая идея, почему этот код не работает?

protocol APIRequest {
    associatedtype Result
}

func execute<T: APIRequest>(request: T) {
    if let decodableResult = T.Result.self as? Decodable {
        try JSONDecoder().decode(decodableResult, from: Data())
    }
}

Я получаю сообщение об ошибке Cannot invoke 'decode' with an argument list of type '(Decodable, from: Data)' в этой строке: try JSONDecoder().decode(decodableResult, from: Data())

Любой вклад приветствуется!


person Balázs Vincze    schedule 22.01.2019    source источник


Ответы (1)


Метод JSONDecoder.decode(_:from:) требует конкретного типа, соответствующего Decodable, в качестве входного аргумента. Вам нужно добавить дополнительное ограничение типа к T.Result, чтобы сделать его Decodable.

func execute<T: APIRequest>(request: T) throws where T.Result: Decodable {
    try JSONDecoder().decode(T.Result.self, from: Data())
}

Кстати, какой смысл пытаться декодировать пустой экземпляр Data?

person Dávid Pásztor    schedule 22.01.2019
comment
Спасибо за быстрый ответ. Нет смысла декодировать пустые данные, это просто проверка концепции в Playground. Причина, по которой я не хочу добавлять ограничение типа, заключается в том, что я хочу иметь определенные запросы с типами результатов, которые не поддаются декодированию. Как-нибудь обойти это? - person Balázs Vincze; 22.01.2019
comment
@BalázsVincze, вы должны перегрузить execute(request:), чтобы иметь его версию специально для несовместимых с Decodable T.Result - person Dávid Pásztor; 22.01.2019