Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误

Posted

技术标签:

【中文标题】Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误【英文标题】:Swift 2.3 to Swift 3.1 Migration - Alamofire request error 【发布时间】:2017-07-21 11:19:04 【问题描述】:

我正在将使用 Swift 2.3 的现有项目转换为 Swift 3.1。 到目前为止,我成功地按照 Xcode 的建议实施了所有更改,并且还添加了最新的 POD。

一切似乎都很好,除了以下 - (因为这是一个已经存在的代码,我部分理解了正在做的事情)。

我有以下要求 -

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'

按照from here的解决方案,我的其他请求已成功更改,并且没有任何问题。

我唯一的问题是 Mappable 类型的请求。它在 Swift 2.3 中运行良好。

有人可以说明实际发生的情况以及需要做些什么来解决 Swift 3.1 中出现的这个问题吗?

【问题讨论】:

你有什么错误吗? 是的,问题中提到了 - 'Argument type 'ModifyProfileServiceAPIWithAlamofire.ModifyProfileAddressAPIRequestData' 不符合预期的类型 'URLRequestConvertible'' 【参考方案1】:

您需要实现此方法以符合 Alamofire.swift 中定义的 URLRequestConvertible

/// 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()
        

        

希望对你有帮助

【讨论】:

是的,我有一个问题。如何发送一个空的 URLRequest?我的意思是,在“如果让”失败条件的情况下? 您可以返回一个空的 URLRequest,但您的服务器当然不会有任何答案,我的答案已被编辑【参考方案2】:

我想回答我自己的问题。我对请求进行了如下更改(请参阅我的问题以获取原始代码)

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 和我的数据。因此,可映射结构保持不变(与我的问题一样)。

【讨论】:

以上是关于Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 2.3 迁移到 Swift 3 错误消息

我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

错误:Swift 2.3 不支持核心数据代码生成

Swift 2.3 中没有这样的模块“UserNotifications”

Swift进阶之内存模型和方法调度

迁移到惯用的 Swift 2 的清单(又名 Swift 2 转换指南在哪里)?