如何在Swift中实现解码通用功能

如何在Swift中实现解码通用功能,swift,function,methods,alamofire,decoding,Swift,Function,Methods,Alamofire,Decoding,我必须从Alamofire获取一些json并将它们保存到我创建的不同结构中,但是我找不到方法为我需要创建的所有请求创建一个方法。这是我的方法 func fetchData(url: String, parameters: [String : Any], finished: @escaping (EmployeeCompositionApp) -> Void) { Alamofire.request(url, method: .post

我必须从Alamofire获取一些json并将它们保存到我创建的不同结构中,但是我找不到方法为我需要创建的所有请求创建一个方法。这是我的方法

func fetchData(url: String, parameters: [String : Any], finished: @escaping (EmployeeCompositionApp) -> Void)  {

    Alamofire.request(url,
                      method: .post,
                      parameters: parameters).responseJSON(completionHandler: { response in

        guard response.result.error == nil else {
            print("Error en la petición a Alamofire:\n \(String(describing: response.result.error))")
            return
        }
        guard let json = response.result.value as? [String : Any] else {
            if let error = response.result.error {
                print("Error: \(error.localizedDescription)")
            }
            return
        }
        do {
            let decoder = JSONDecoder()
            let rawData = try JSONSerialization.data(withJSONObject: json, options: [])
            let dataObject = try decoder.decode(EmployeeCompositionApp.self, from: rawData)
            finished(dataObject)

        } catch let error {

            print("Error")
                        }
    })
}
但是当我试图替换
Any
或任何其他泛型类型的
EmployeeCompositionApp
时,Xcode说

无法使用类型为“(Any,from:Data)”的参数列表调用“decode”


我该怎么做呢?

您只需要将类型设置为可解码的类型即可:

func fetchData<T: Decodable>(url: String, parameters: [String : Any], finished: @escaping (T) -> Void) {
还请注意,使用
Alamofire
将JSON数据转换为字典,然后将其编码回
data
,以便可以使用
JSONDecoder()。使用
.responseData
代替
.responseJSON

func fetchData<T: Decodable>(url: String, parameters: [String : Any], finished: @escaping (T) -> Void)  {
    Alamofire.request(
        url,
        method: .post,
        parameters: parameters
    ).responseData { response in
        guard
           response.result.error == nil,
           let data = response.result.value
        else {
           print("Error en la petición a Alamofire:\n \(String(describing: response.result.error))")
           return
        }

        do {
            let decoder = JSONDecoder()
            let dataObject = try decoder.decode(T.self, from: data)
            finished(dataObject)
        } catch {
            print("Error")
        }
    }
}
func fetchData(url:String,参数:[String:Any],finished:@escaping(T)->Void){
阿拉莫菲尔请求(
网址,
方法:.post,
参数:参数
).responseData{response in
警卫
response.result.error==nil,
让数据=response.result.value
否则{
打印(“Alamofire:\n\(字符串(描述:response.result.Error))中的错误)
回来
}
做{
let decoder=JSONDecoder()
让dataObject=try decoder.decode(T.self,from:data)
已完成(数据对象)
}抓住{
打印(“错误”)
}
}
}

还请注意,当发生错误时,您应该以某种方式将该信息返回给调用者,而不仅仅是打印错误。

您应该使用符合
的类型。非常感谢!这解决了我的问题
func fetchData<T: Decodable>(url: String, parameters: [String : Any], finished: @escaping (T) -> Void)  {
    Alamofire.request(
        url,
        method: .post,
        parameters: parameters
    ).responseData { response in
        guard
           response.result.error == nil,
           let data = response.result.value
        else {
           print("Error en la petición a Alamofire:\n \(String(describing: response.result.error))")
           return
        }

        do {
            let decoder = JSONDecoder()
            let dataObject = try decoder.decode(T.self, from: data)
            finished(dataObject)
        } catch {
            print("Error")
        }
    }
}