#ios #swift #function #generics
Вопрос:
Я пытаюсь передать модель/структуру в качестве параметра в функции и передать ее другой структуре/модели с общим типом вот мой код
—> Функция
func getAPICallModelDecodable<T:Codable> (url:String,model:T,
success: @escaping (_ responseObject:T?)->Void,
failure: @escaping (_ error:String) -> Void ,
method:HTTPMethod = .get) {
print(type(of: model))
AF.request(url,method:method).responseDecodable(of: FetchAPI<T(Want to pass model parameter here)>.self) { respons in
print(respons)
switch respons.result {
case .success(let data):
if data.flag! {
success(data.data)
}
case .failure(let error):
failure(error.localizedDescription)
}
}
}
—> Структура FetchAPI
struct FetchAPI<T:Codable>:Codable {
var flag: Bool?
var statusCode: Int?
var message: String?
var data: T?
enum CodingKeys: String, CodingKey {
case flag = "Flag"
case statusCode = "StatusCode"
case message = "Message"
case data = "Data"
}
}
Параметром модели может быть любая кодируемая структура
Комментарии:
1. FetchAPI<T. self>.self показывает ошибку «‘<T. self>>’ не является постфиксным унарным оператором»
Ответ №1:
В настоящее время ваша функция getAPICallModelDecodable
определена таким образом, что вы должны передать модель типа T. Но если я правильно понимаю, вы хотите только передать (определить) тип T.
Для этого вам необходимо изменить функцию следующим образом:
func getAPICallModelDecodable<T:Codable> (url: String, type: T.Type,
success: @escaping (_ responseObject:T?)->Void,
failure: @escaping (_ error:String) -> Void ,
method:HTTPMethod = .get)
В теле функции вы можете использовать T, например, просто так:
AF.request(url,method:method).responseDecodable(of: FetchAPI<T>.self)
Вызов функции будет выглядеть следующим образом:
getAPICallModelDecodable(url: ..., type: Model.self, ...)
Комментарии:
1. сбой происходит показывает ошибку
Expected to decode Array<Any> but found a dictionary instead
2. « MyApiManager.shared.getAPICallModelDecodable(url: ServerAPI.getпроекты, модель: [Проекты].самостоятельно, успех: { ответ в успехе(ответ) }, сбой: { ошибка в сбое(ошибка) }) «
3. @NoorAhmedNatali Эта ошибка является ошибкой декодирования: ожидаемая модель не может быть создана из заданных данных. Вы должны настроить свой тип T, он же модель. В противном случае, ответ Йоханнеса совершенно верен. 😉 Также совет: попробуйте использовать URLSession.shared напрямую вместо AF (временно), чтобы четко видеть, что происходит на уровне HTTP.