Параметр Swift Encodable и ответ Decodable - PullRequest
0 голосов
/ 26 мая 2020

Я переношу старый метод, который у меня был с помощью Alamofire, где у меня есть такая функция:

protocol httpRequestSwiftDelegate {
    func httpRequestSwiftError(_ error: NSError, tag: Int)
    func httpRequestSwiftResponse(_ response: JSON, tag: Int)
}

class httpRequestSwift {
    func requestURL(method: HTTPMethod, url : String, params: [String: String], tag: Int)
}

Затем я бы делегировал ответ или ошибку контроллеру, который его вызвал.

Теперь, когда я хочу использовать Alamofire 5 и воспользоваться функциями Decodable и Encodable, у меня возникли проблемы с определением параметров.

На мой взгляд, это должно быть примерно так:

func requestURL(method: HTTPMethod, url : String, params: Encodable, decodable: Decodable, tag: Int)  {
    session.request(keychain.string(forKey: K.Api.baseUrl)! + url, method: method, parameters: params)
}

но я получаю сообщение об ошибке:

Значение типа протокола «Encodable» не может соответствовать «Encodable»; только типы struct / enum / class могут соответствовать протоколам

Спасибо.

1 Ответ

0 голосов
/ 27 мая 2020

Да, Encodable должен использоваться как общий c параметр, его нельзя использовать как экзистенциальный. Вместо

func requestURL(method: HTTPMethod, url : String, params: Encodable, decodable: Decodable, tag: Int)

вам понадобится что-то вроде

func requestURL<Parameters, Response>(method: HTTPMethod, url : String, params: Parameters, decodable: Response, tag: Int) 
    where Parameters: Encodable, Response: Decodable
...