【问题标题】:Response class type in Alamofire requestAlamofire 请求中的响应类类型
【发布时间】:2017-09-30 22:56:35
【问题描述】:

我是 swift 3 编程新手,我正在使用 Alamofire 进行 api 调用并避免繁琐的 json 配对,我正在使用 AlamofireObjectMapper 库。 我有一个ApiController,它有一个调用api的函数,下面是它的代码:

public static func makePostRequest<T: Mappable>(url: String, params: Parameters, networkProtocol: NetworkProtocol, responseClass: T){

    let headers = getHeaders()

    networkProtocol.showProgress()

    Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers)
        .validate()
        .responseObject{
            (response: DataResponse<T>) in

            switch(response.result){
            case .success(_):
                networkProtocol.hideProgress()
                networkProtocol.onResponse(response: response)
                break
            case .failure(_):
                networkProtocol.hideProgress()
                networkProtocol.onErrorResponse(response: response)
                break
            }

    }

下面是我的模型类:

import ObjectMapper

    class BaseResponse: Mappable {

    required init?(map: Map) {

    }

    func mapping(map: Map) {

    }
}

下面是类调用 api 的函数:

public static func callSomeApi(params: Parameters, networkProtocol: NetworkProtocol){
    ApiHelper.makePostRequest(url: AppConstants.URLs.API_NAME, params: params, networkProtocol: networkProtocol, responseClass: BaseResponse)
}

现在错误在下面一行

ApiHelper.makePostRequest(url: AppConstants.URLs.API_NAME, params: params, networkProtocol: networkProtocol, responseClass: BaseResponse)

上面写着Argument type 'BaseResponse.Type' does not conform to expected type 'Mappable'

有人请帮我解决这个问题,现在卡在这个问题上很长一段时间了。

【问题讨论】:

  • 你能显示你的'responseClass'的代码吗?此外,您应该将您的类命名为 ResponseClass。
  • 您是否复制粘贴了此代码? responseClass 应该是请求结果将被映射到的类的名称。将其替换为 this format 之后的类名。
  • @Toldy 我希望类名是动态的,这就是为什么我想接受响应类名作为参数
  • 哦,对不起,我没有看到你被拿了类名作为参数。然后responseClass 是您的变量的名称。 T 是它的类型。把&lt;responseClass&gt;改成&lt;T&gt;,把makePostRequest&lt;T&gt;改成makePostRequest&lt;T: Mappable&gt;(因为responseObject只接受遵守可映射协议的对象)
  • 您是否添加了好的导入 like hereMappable 是在 ObjectMapper 中定义的,如果我没记错的话

标签: ios swift swift3 alamofire objectmapper


【解决方案1】:

这是一个使用对象映射的引用请求

import Alamofire
import ObjectMapper
import AlamofireObjectMapper


       func requestUrl<T:Mappable>(url: URLRequestConvertible, withSuccess success:@escaping (_ response: T) -> ()) {
        Utils.addHUD()

        Alamofire.request(url).validate().responseObject { (response :DataResponse<T>) in
            Utils.hideHUD()
            guard response.result.isSuccess else{
                Utils.showAlert(message: (response.result.error?.localizedDescription)!, action: {

                })
                return
            }
            let root:RootClass = response.result.value as! RootClass
            if root.status  == "Fail"{
                Utils.showAlert(message: (root.msg!), action: {

                })
            }else{

                success(response.result.value!)
            }
        }


    }

这是我要映射的班级

import ObjectMapper


class RootClass : NSObject, Mappable{

    var data : [String : Any]?
    var msg : String?
    var status : String?


    class func newInstance(map: Map) -> Mappable?{
        return RootClass()
    }

    required init?(map: Map){
        super.init()
    }
    private override init(){
        super.init()
    }

    func mapping(map: Map)
    {
        data <- map["data"]
        msg <- map["msg"]
        status <- map["status"]

        }
}

【讨论】:

  • 这里请求返回 JSON 数据,我希望 JSON 映射到我正在使用这个库的对象 github.com/tristanhimmelman/AlamofireObjectMapper
  • 检查我更新的问题现在得到错误为“使用未声明的类型'Mappable'”
  • 你导入ObjectMapper和AlamofireObjectMapper了吗
  • 是的那是错误但现在再次更新问题,这次有一个新问题
【解决方案2】:

使用块时不需要向块声明参数的类型:

Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers)
    .validate()
    .responseData { response in

        switch(response.result){
        case .success(_):
            networkProtocol.hideProgress()
            networkProtocol.onResponse(response: response)
            break
        case .failure(_):
            networkProtocol.hideProgress()
            networkProtocol.onErrorResponse(response: response)
            break
        }

}

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多