Я создал декодируемую базовую структуру для ответа API.
struct ResponseBaseModel<T: Decodable>: Decodable {
let status: Bool
let message: String
var result: T?
private enum CodingKeys: String, CodingKey {
case result, message, success,status,statusCode
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
if let result = try? values.decode(T.self, forKey: .result) {
self.result = result
}
status = try values.decode(Bool.self, forKey: .status)
message = try values.decode(String.self, forKey: .message)
}
}
// вот ответ API
{
"status": true,
"statusCode": 200,
"message": "Theater list successfully",
"result": [
{
"id": 1,
"name": "Galaxy",
"picture": "https://ctdemo.workpc.online/kshatrainfotech/abol-app/public/storage/images/theaters/default.png",
"is_notify": false
}
]
}
вот как я использую его для вызова API
apimanager.fetch { [weak self] (response: Result<ResponseBaseModel<[Theater]>, ApiError>) in
self?.handelResponse(response: response) { response in
switch response {
case .success(let theaterList):
self?.theaterViewModels = theaterList.map{ TheaterViewModel(theaterModel: $0)}
self?.responseHandler(.success(self!.theaterViewModels))
case .failure(let apiError):
self?.responseHandler(.failure(apiError))
}
}
}
, но у некоторых API нет результата, например
{"status": true, "statusCode": 200, "message": "api.DATA_UPDATED_SUCCESS"}
как обрабатывать вышеуказанный ответ с моделью ResponseBaseModel. Потому что мне приходится передавать любой тип при работе со структурой ResponseBaseModel.
ResponseBaseModel<?>
Я уже пробовал ResponseBaseModel<nil>
, но это не сработало.