У меня есть следующая структура с обобщениями для ответа API с нумерацией страниц:
struct Paginable<Body> {
let data: [Body]
let meta: Meta
}
extension Paginable {
struct Meta: Codable {
let pagination: Pagination
struct Pagination: Codable {
let total: Int
let count: Int
let perPage: Int
let currentPage: Int
let totalPages: Int
}
}
}
И я хочу иметь возможность декодировать это так:
let response = try? response.decode(to: Paginable<Segment>.self)
Итак, вот моя попытка сделать это Decodable
:
extension Paginable where Body == Data {
func decode<BodyType: Decodable>(to type: BodyType.Type) throws -> Paginable<BodyType> {
guard let decodedJSON = try? JSONDecoder().decode(BodyType.self, from: data) else {
throw APIError.decodingFailure
}
return Paginable<BodyType>(data: decodedJSON, meta: self.meta)
}
}
Это дает мне две ошибки:
Невозможно преобразовать значение типа 'Paginable.Meta' в ожидаемый тип аргумента 'Paginable <_>. Meta'
на линии с return
оператором
Если я изменю свойство meta на некоторый примитивный тип, например Int, ошибка исчезнет. Но сама мета Codable
, так в чем тут проблема?
Невозможно преобразовать значение типа «[Данные]» в ожидаемый тип аргумента «Данные»
в строке с guard
оператором
Как решить это?