【问题标题】:Could not cast value of type T.Type to T无法将 T.Type 类型的值转换为 T
【发布时间】:2019-09-06 06:00:52
【问题描述】:

我正在尝试使用AlamofireObjectMapper 发送请求的通用方法,其中输入为BasicMappable(通用类型),输出为响应

func sendRequest<T>(endPoint: String,
                    parameters: Parameters,
                    method: HTTPMethod,
                    mappingObject: T.Type) -> T where T : BaseMappable {
        var answer = T.self
        Alamofire.request(applicationBaseURL + endPoint,
                          method: method,
                          parameters: parameters,
                          headers: nil)
            .responseObject { ( response: DataResponse<T>) in
                let data = response.result.value
                answer = data as! T.Type
        }
        return answer as! T
    }

所以我在 VC 中这样使用这个方法:

let authResponse = requestHelper.sendRequest(endPoint: "/auth/users/create/",
                                             parameters: params,
                                             method: .post,
                                             mappingObject: AnswerClass.self)

而且它构建得很好。 但是当我尝试发送请求时,我遇到了崩溃和错误

Could not cast value of type 'Travel.AuthController.AnswerClass.Type' (0x110186bf8) to 'Travel.AuthController.AnswerClass' (0x10de153b0).
2019-04-15 18:42:28.811494+0300 Travel[9951:596186] Could not cast value of type 'Travel.AuthController.AnswerClass.Type' (0x110186bf8) to 'Travel.AuthController.AnswerClass' (0x10de153b0).

我已经用这个在 VC 中做过了

Alamofire.request(applicationBaseURL + "/auth/users/create/",
                                  method: .post,
                                  parameters: params,
                                  headers: nil)
   .responseObject { (response: DataResponse<AnswerClass>) in
                        let loginRespone = response.result.value
                        for error in loginRespone?.errors ?? [] {
                            print(error.detail)
                            print(error.source)
                            print(error.status)
                        }

而且效果很好

但我想让这个方法对整个项目通用

如何正确转换这些类型的值或有其他方法吗?

【问题讨论】:

    标签: swift generics alamofire objectmapper


    【解决方案1】:

    感谢@Kamran 的帮助!

    我的最终解决方案是:

    class RequestHelper {
        func sendRequest<T>(endPoint: String,
                            parameters: Parameters,
                            method: HTTPMethod,
                            mappingObject: T.Type,
                            completion: @escaping (_ response: T?, _ error: Error?) -> Void) where T : BaseMappable {
            Alamofire.request(applicationBaseURL + endPoint,
                              method: method,
                              parameters: parameters,
                              headers: nil)
                .responseObject { ( response: DataResponse<T>) in
                    switch response.result {
                    case .success(let value):
                        completion(value, nil)
                    case .failure(let error):
                        completion(nil, error)
                    }
            }
        }
    }
    

    【讨论】:

    • 这完全没问题
    【解决方案2】:

    你需要使用completionHandler来获取对象,

    func sendRequest<T>(endPoint: String,
                        parameters: Parameters,
                        method: HTTPMethod,
                        mappingObject: T.Type,
                        completion: (T?, Error?) -> Void) {
        Alamofire.request(applicationBaseURL + endPoint,
                          method: method,
                          parameters: parameters,
                          headers: nil)
            .responseObject { ( response: DataResponse<T>) in
                switch response.result {
                case .success(let value):
                    completion(value, nil)
                case .failure(let error):
                    completion(nil, error)
                }
    
        }
    }
    

    【讨论】:

    • @sigald 状态 400 表示 API 不成功。当错误代码为 400 时,您无法转到 .success 案例。您能否提供更多关于您尝试实现的目标的信息?
    • 是的。例如“使用此电子邮件的用户已经存在”它是 .success 但状态为 400 的错误。我不知道为什么。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2022-11-25
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多