Наконец, я нашел один Workaround.i создал два базовых класса, один для массива объекта и один для одного объекта.
struct ResponseBaseArray<T:Codable> : Codable {
let code : String?
let data : [T]?
let message : String?
enum CodingKeys: String, CodingKey {
case code = "Code"
case data = "Data"
case message = "Message"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
code = try values.decodeIfPresent(String.self, forKey: .code)
data = try values.decodeIfPresent([T].self, forKey: .data)
message = try values.decodeIfPresent(String.self, forKey: .message)
}
}
struct ResponseBaseObject<T:Codable> : Codable {
let code : String?
let data : T?
let message : String?
enum CodingKeys: String, CodingKey {
case code = "Code"
case data = "Data"
case message = "Message"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
code = try values.decodeIfPresent(String.self, forKey: .code)
data = try values.decodeIfPresent(T.self, forKey: .data)
message = try values.decodeIfPresent(String.self, forKey: .message)
}
}
Ниже приведен код для методов Api.
class BaseApiClient {
static let `default` = BaseApiClient()
private init() {
}
func fetch<model:Codable>(request:APIRouter , decoder: JSONDecoder = JSONDecoder() ,onSuccess: @escaping (model) -> Void) {
if Connectivity.isReachable {
(UIApplication.shared.delegate as! AppDelegate).addProgressView()
Alamofire.request(request).responseJSON { (response) in
switch response.result {
case .success( let apiResponse) :
DispatchQueue.main.async {
(UIApplication.shared.delegate as! AppDelegate).hideProgrssVoew()
}
if let responseData = apiResponse as? [String:Any] , let status = responseData["Code"] as? String , status == "SUCCESS" {
do {
let responseModel = try decoder.decode(model.self, from: response.data!)
onSuccess(responseModel)
}
catch let error as NSError {
print("failed reason : \(error.localizedDescription)")
}
}
else {
UIApplication.shared.gettopMostViewController()?.presentAlerterror(title: "Erorr", message: "Service not Avilabel" ,okclick: nil)
}
case .failure(let error) :
UIApplication.shared.gettopMostViewController()?.presentAlerterror(title: "Erorr", message: error.localizedDescription, okclick: nil)
}
}
}
else {
(UIApplication.shared.delegate as! AppDelegate).hideProgrssVoew()
UIApplication.shared.gettopMostViewController()?.presentAlerterror(title: "Error", message: "connnection not avilabel", okclick: nil)
}
}
}
Ниже приведен код вызова Api.
BaseApiClient.default.fetch(request: APIRouter.GetSocialWarmerType) { (rsult:ResponseBaseArray<[SocialWarmer]>) in
print(rsult.data)
}
если ваш Api возвращает один объект, чем использовать ResponseBaseObject.
BaseApiClient.default.fetch(request: APIRouter.GetSocialWarmerType) { (rsult:ResponseBaseObject<SocialWarmer>) in
print(rsult.data)
}
но все же это решение будет работать, только если вы уже знаете, что ваш Api вернет один объект или массив объектов.