Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 无法将类型为T的值强制转换为T_Swift_Generics_Alamofire_Objectmapper - Fatal编程技术网

Swift 无法将类型为T的值强制转换为T

Swift 无法将类型为T的值强制转换为T,swift,generics,alamofire,objectmapper,Swift,Generics,Alamofire,Objectmapper,我正在尝试使用AlamoFileObjectMapper创建一个通用方法,用于发送请求,其中输入是BasicMapable(通用类型),输出是响应 func sendRequest(端点:字符串, 参数:参数, 方法:HTTPMethod, 映射对象:T.Type)->T其中T:BaseMappable{ var-answer=T.self 请求(applicationBaseURL+端点, 方法:方法,, 参数:参数, 标题:无) .responseObject{(响应:DataRespons

我正在尝试使用
AlamoFileObjectMapper
创建一个通用方法,用于发送请求,其中输入是
BasicMapable
(通用类型),输出是响应

func sendRequest(端点:字符串,
参数:参数,
方法:HTTPMethod,
映射对象:T.Type)->T其中T:BaseMappable{
var-answer=T.self
请求(applicationBaseURL+端点,
方法:方法,,
参数:参数,
标题:无)
.responseObject{(响应:DataResponse)位于
让数据=response.result.value
答案=数据为!T.类型
}
返回答案为!T
}
所以我在VC中使用这种方法:

let authResponse=requestHelper.sendRequest(端点:“/auth/users/create/”,
参数:params,
方法:.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/”,
方法:.post,
参数:params,
标题:无)
.responseObject{(响应:DataResponse)位于
让loginRespone=response.result.value
对于loginRespone?中的错误。错误???[]{
打印(错误。详细信息)
打印(错误。来源)
打印(错误。状态)
}
而且效果很好

但是我想让这个方法在整个项目中通用


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

您需要使用下面的
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)
            }

    }
}
func sendRequest(端点:字符串,
参数:参数,
方法:HTTPMethod,
mappingObject:T.类型,
完成:(T?,错误?->无效){
请求(applicationBaseURL+端点,
方法:方法,,
参数:参数,
标题:无)
.responseObject{(响应:DataResponse)位于
开关响应。结果{
成功案例(let value):
完成(价值,零)
案例。失败(let错误):
完成(无,错误)
}
}
}

谢谢你,@Kamran感谢你的帮助

我的最终解决办法是:

类请求帮助器{
func sendRequest(端点:字符串,
参数:参数,
方法:HTTPMethod,
mappingObject:T.类型,
完成:@escaping(\response:T?,\error:error?->Void)其中T:BaseMappable{
请求(applicationBaseURL+端点,
方法:方法,,
参数:参数,
标题:无)
.responseObject{(响应:DataResponse)位于
开关响应。结果{
成功案例(let value):
完成(价值,零)
案例。失败(let错误):
完成(无,错误)
}
}
}
}

@sigald Status 400表示API未成功。当错误代码为400时,您不能转到
。success
案例。您可以提供有关您尝试实现的目标的更多信息吗?它是。例如“此电子邮件的用户已存在”。它是。成功但状态为400。我不知道为什么。感谢您的帮助!这完全可以