Как передать параметр функции в общую структуру в swift

#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.