В зависимости от ваших потребностей вы можете использовать обобщенные элементы для составления всей структуры.
Начните с ваших моделей данных
struct User: Decodable {
let avatar_url: String
let created_at: String
let updated_at: String
let email: String
let id: Int
let name: String
let username: String
}
struct Room: Decodable {
let id: Int
let name: String
}
Цель состоит в том, чтобы получить красивые составные типы.
typealias UserResponse = Response<Result<User, Meta>>
typealias RoomResponse = Response<Result<Room, Meta>>
Обобщенные типы для построения из
struct Response<ResultType: Decodable>: Decodable {
let results: ResultType
let status: Int
}
struct Result<ItemType: Decodable, MetaType: Decodable>: Decodable {
let meta: MetaType
let items: [ItemType]
}
Четный Meta
является отдельной частью композиции.
struct Meta: Decodable {
let total_data: Int
let total_page: Int
}
Теперь давайте скажем, что нам нужен пользовательский Meta
для ответа Room
struct PagedMeta: Decodable {
let current_page: Int
let page_count: Int
}
Вот новый тип
typealias RoomPagedResponse = Response<Result<Room, PagedMeta>>