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

标签 ios swift swift3 nsurlrequest urlrequest

我正在将一个使用 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 请求中收到一个错误 参数类型“ModifyProfileServiceAPIWithAlamofire.ModifyProfileAddressAPIRequestData”不符合预期类型“URLRequestConvertible

我的其他请求已通过解决方案成功更改 from here它可以正常工作。

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

有人可以阐明实际发生的事情以及需要做什么来解决 Swift 3.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()
        }

    }    
}

希望对你有帮助

关于ios - Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45236324/

相关文章:

Swift UIImagePickerController didFinishPickingMediaWithInfo 未触发

json - 接收顶层带有括号的格式错误的 JSON

ios - 在 iOS 中基于 Storyboard的应用程序中使用我的 View Controller

ios - 我可以在不增加行高的情况下调整 NSAttributedString 中的基线吗?

ios - 调试版本和发布版本中 BOOL 变量的不同值

iphone - uiview 中的 uiscrollview 不滚动

ios - 如何快速播放来自http数据流的音频

swift 4+ : Issues copying a String to Clipboard using NSPasteboard

swift - ARKit:如何在 Storyboard 中向 ARView 添加按钮?

ios - 将 CMTime 保存在核心数据 + Xcode8 + swift3 中