У меня ошибка вывода типа, которую я не могу устранить.Я приложил самый важный фрагмент ниже.Процесс синтаксического анализа выполняется отдельно Decoder
в APIClient
.
. Почему APIClient
execute
не распознает T
как [Chapter]
каклиния completion(Result.success(decodedData))
имеет этот тип?
func loadFeed(completion: @escaping (Result<[Chapter]>) -> Void) {
APIClient.shared.execute(APIRequest.loadFeed) { response in
guard let decodedData = response.decodedData else { return }
completion(Result.success(decodedData))
}
}
Вышеприведенный фрагмент - это то, как я называю APIClient
в моем классе Services
.
class APIClient: APIClientProtocol {
static let shared = APIClient()
func execute<T: Decodable>(_ apiRequest: APIRequestDefining,
responseDecoder: ResponseDecoder = .jsonDecoding,
completionHandler: @escaping (Response<T>) -> Void) {
var response = Response<T>(request: request, httpResponse: dataResponse.response, data: dataResponse.data)
do {
try responseDecoder.decode(response: &response)
} catch {
response.error = error
}
completionHandler(response)
}
}
public struct Response<T> {
var decodedData: T?
}
enum Result<Value> {
case success(Value)
case failure(Error)
}
РЕДАКТИРОВАТЬ: Для пояснения ниже приведен фрагмент кода, где и как я decode
необработанный ответ на предполагаемый объект.
struct JSONResponseDecoder: ResponseDecoding {
func decode<T: Decodable>(response: inout Response<T>) throws {
guard let data = response.data else { return }
do {
try response.decodedData = JSONDecoder().decode(T.self, from: data)
} catch {
throw(ApplicationError(errorType: .decodingError))
}
}
}
РЕДАКТИРОВАТЬ !!!!:
Я нашел действительно странную вещь, я удаляю строку с guard
, все отлично работает, почему это так?
До : После :