Вот ваше объявление метода:
func getData<K: Codable>(request: URLRequest, completion: @escaping (Result<[K]>) -> Void)
Этот метод имеет параметр типа K
, который используется только в типе аргумента completion
. Когда компилятор видит вызов getData
, он должен определить конкретный тип для K
на основе типа аргумента замыкания, которое вы передаете как completion
.
А вот ваш звонок:
networkClient.getData(request: urlRequest) { (result) in
// Do stuff
}
В этом вызове закрытие completion
составляет { (result) in }
. Какой тип result
? Об этом нет никакой информации, поэтому все, что знает компилятор, это то, что result
должен иметь тип Result<[K]>
для некоторого типа K
. У него нет способа вывести конкретный тип для K
, поэтому он выдает ошибку.
Вы можете сделать тип явным, как этот:
networkClient.getData(request: urlRequest) { (_ result: Result<[SomeConcreteCodableType]>) -> Void in
// Do stuff
}
, где SomeConcreteCodableType
- это конкретный тип, соответствующий Codable
. Соответствие Codable
требуется из-за ограничения в объявлении getData
.
Другое решение состоит в том, чтобы изменить getData
на другой аргумент, который позволяет вызывающей стороне указывать K
напрямую:
func getArray<K: Codable>(of: K.Type, for request: URLRequest,
completion: @escaping (Result<[K]>) -> Void) {
...
}
Тогда вы называете это так:
networkClient.getArray(of: SomeConcreteCodableType.self, for: request) { result in
// Do stuff
}