Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误
Swift 2.3 to Swift 3.1 Migration - Alamofire request error
我正在将使用 Swift 2.3 的现有项目转换为 Swift 3.1。
到目前为止,我已成功按照 Xcode 建议实施所有更改,并且还添加了最新的 PODs。
一切似乎都很好,除了以下内容 -(因为这是一个已经存在的代码,我部分理解正在做什么)。
我有以下要求 -
var request = ModifyProfileAddressAPIRequestData()
request.clientContext = ClientContext()
request.customer = AddressContext(address: CustomerAddress(countryName:countryName, countryCode: countryCode, locationName:locationName,houseNr: houseNr, streetName: streetName, postalCode:postalCode, box: box ))
request.fields = "customer.address"
let parameters = request.toJSON()
DDLogVerbose("modifyProfileURL parameters JSON:\(parameters)")
alamofireConfigure().request(request).validate(statusCode: 200..<503).responseObject{ (responseData: DataResponse<UserProfile>) in
...
并且 ModifyProfileAddressAPIRequestData 是一个可映射结构,如下所示 -
fileprivate struct ModifyProfileAddressAPIRequestData : Mappable{
var customer: AddressContext?
var clientContext: ClientContext?
var fields:String?
init() {}
init?(map: Map) {}
mutating func mapping(map: Map) {
customer <- map["customer"]
clientContext <- map["clientContext"]
fields <- map["fields"]
}
}
我在 alamofireConfigure 请求中收到一个错误
Argument type 'ModifyProfileServiceAPIWithAlamofire.ModifyProfileAddressAPIRequestData' does not conform to expected type '
URLRequestConvertible'
我的其他请求已按照解决方案 成功更改,并且没有任何问题。
我唯一的问题是 Mappable 类型的请求。它在 Swift 2.3.
中运行良好
有人可以阐明实际发生的事情以及需要做什么来解决 Swift 3.1 中出现的这个问题吗?
您需要实现此方法以符合 URLRequestConvertible
Alamofire.swift
中的定义
/// Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests.
public protocol URLRequestConvertible {
/// Returns a URL request or throws if an `Error` was encountered.
///
/// - throws: An `Error` if the underlying `URLRequest` is `nil`.
///
/// - returns: A URL request.
func asURLRequest() throws -> URLRequest
}
我觉得你需要
fileprivate struct ModifyProfileAddressAPIRequestData : Mappable,URLRequestConvertible{
var customer: AddressContext?
var clientContext: ClientContext?
var fields:String?
init() {}
init?(map: Map) {}
mutating func mapping(map: Map) {
customer <- map["customer"]
clientContext <- map["clientContext"]
fields <- map["fields"]
}
func asURLRequest() throws -> URLRequest{
if let url = URL(string:"your http://......"){
return URLRequest(url: url)
}else{
return URLRequest()
}
}
}
希望对您有所帮助
我想回答我自己的问题。我对请求进行了如下更改(原始代码请参阅我的问题)
var request = URLRequest(url: URL(string: modifyProfileURL)!)
var data = ModifyProfileAddressAPIRequestData()
data.clientContext = ClientContext()
data.customer = AddressContext(address: CustomerAddress(countryName:countryName, countryCode: countryCode, locationName:locationName,houseNr: houseNr, streetName: streetName, postalCode:postalCode, box: box ))
data.fields = "customer.address"
let parameters = data.toJSONString()
request.httpBody = parameters?.data(using: .utf8)
request.httpMethod = "POST"
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(accessTokenRequest.accessToken)", forHTTPHeaderField: "Authorization")
alamofireConfigure()
.request(request)
.validate(statusCode: 200..<503)
.responseObject{ (responseData: DataResponse<UserProfile>) in
.
.
.
我基本上区分了 URLRequest 和我的数据。因此 Mappable Struct 保持不变(如我的问题)。
我正在将使用 Swift 2.3 的现有项目转换为 Swift 3.1。 到目前为止,我已成功按照 Xcode 建议实施所有更改,并且还添加了最新的 PODs。
一切似乎都很好,除了以下内容 -(因为这是一个已经存在的代码,我部分理解正在做什么)。
我有以下要求 -
var request = ModifyProfileAddressAPIRequestData()
request.clientContext = ClientContext()
request.customer = AddressContext(address: CustomerAddress(countryName:countryName, countryCode: countryCode, locationName:locationName,houseNr: houseNr, streetName: streetName, postalCode:postalCode, box: box ))
request.fields = "customer.address"
let parameters = request.toJSON()
DDLogVerbose("modifyProfileURL parameters JSON:\(parameters)")
alamofireConfigure().request(request).validate(statusCode: 200..<503).responseObject{ (responseData: DataResponse<UserProfile>) in
...
并且 ModifyProfileAddressAPIRequestData 是一个可映射结构,如下所示 -
fileprivate struct ModifyProfileAddressAPIRequestData : Mappable{
var customer: AddressContext?
var clientContext: ClientContext?
var fields:String?
init() {}
init?(map: Map) {}
mutating func mapping(map: Map) {
customer <- map["customer"]
clientContext <- map["clientContext"]
fields <- map["fields"]
}
}
我在 alamofireConfigure 请求中收到一个错误
Argument type 'ModifyProfileServiceAPIWithAlamofire.ModifyProfileAddressAPIRequestData' does not conform to expected type '
URLRequestConvertible'
我的其他请求已按照解决方案
我唯一的问题是 Mappable 类型的请求。它在 Swift 2.3.
中运行良好有人可以阐明实际发生的事情以及需要做什么来解决 Swift 3.1 中出现的这个问题吗?
您需要实现此方法以符合 URLRequestConvertible
Alamofire.swift
/// Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests.
public protocol URLRequestConvertible {
/// Returns a URL request or throws if an `Error` was encountered.
///
/// - throws: An `Error` if the underlying `URLRequest` is `nil`.
///
/// - returns: A URL request.
func asURLRequest() throws -> URLRequest
}
我觉得你需要
fileprivate struct ModifyProfileAddressAPIRequestData : Mappable,URLRequestConvertible{
var customer: AddressContext?
var clientContext: ClientContext?
var fields:String?
init() {}
init?(map: Map) {}
mutating func mapping(map: Map) {
customer <- map["customer"]
clientContext <- map["clientContext"]
fields <- map["fields"]
}
func asURLRequest() throws -> URLRequest{
if let url = URL(string:"your http://......"){
return URLRequest(url: url)
}else{
return URLRequest()
}
}
}
希望对您有所帮助
我想回答我自己的问题。我对请求进行了如下更改(原始代码请参阅我的问题)
var request = URLRequest(url: URL(string: modifyProfileURL)!)
var data = ModifyProfileAddressAPIRequestData()
data.clientContext = ClientContext()
data.customer = AddressContext(address: CustomerAddress(countryName:countryName, countryCode: countryCode, locationName:locationName,houseNr: houseNr, streetName: streetName, postalCode:postalCode, box: box ))
data.fields = "customer.address"
let parameters = data.toJSONString()
request.httpBody = parameters?.data(using: .utf8)
request.httpMethod = "POST"
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(accessTokenRequest.accessToken)", forHTTPHeaderField: "Authorization")
alamofireConfigure()
.request(request)
.validate(statusCode: 200..<503)
.responseObject{ (responseData: DataResponse<UserProfile>) in
.
.
.
我基本上区分了 URLRequest 和我的数据。因此 Mappable Struct 保持不变(如我的问题)。