2017-07-21 3 views
1

Je suis en train de convertir un projet existant qui utilisait Swift 2.3 en Swift 3.1. Jusqu'ici, j'ai réussi à implémenter toutes les modifications selon les suggestions de Xcode, et j'ai également ajouté les derniers POD.Migration de Swift 2.3 vers Swift 3.1 - Erreur de requête Alamofire

Tout semble aller bien, sauf ce qui suit - (Puisqu'il s'agit d'un code déjà existant, j'ai partiellement compris ce qui se passe).

J'ai une demande ci-dessous -

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 

... 

Et le ModifyProfileAddressAPIRequestData est un Mappable struct ci-dessous -

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"] 
    }  
} 

Je reçois une erreur dans la demande alamofireConfigure comme Argument type 'ModifyProfileServiceAPIWithAlamofire.ModifyProfileAddressAPIRequestData' does not conform to expected type ' URLRequestConvertible '

Mon autre r demandes, sont modifiées avec succès en suivant la solution from here et cela fonctionne sans aucun problème.

Mon seul problème est avec la requête de type Mappable. Cela fonctionne bien dans Swift 2.3.

Quelqu'un pourrait-il nous éclairer sur ce qui se passe réellement et sur ce qu'il faut faire pour résoudre ce problème dans Swift 3.1, s'il vous plaît?

+0

Avez-vous eu une erreur? – KKRocks

+0

Oui, il est mentionné dans la question - 'Type d'argument' ModifyProfileServiceAPIWithAlamofire.ModifyProfileAddressAPIRequestData 'n'est pas conforme au type attendu' URLRequestConvertible '' –

Répondre

0

Je voudrais répondre ma propre question. J'ai fait des modifications à la demande comme ci-dessous (voir ma question S'il vous plaît le code d'origine)

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 
. 
. 
. 

Je distingue essentiellement entre les URLRequest et mes données. Par conséquent, la structure mappable reste la même (comme dans ma question).

1

Vous devez mettre en œuvre cette méthode pour se conformer URLRequestConvertible comme il est défini dans 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 
} 

Je pense que vous avez besoin

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

    }  
} 

Hope this helps

+0

Oui, et j'ai une question. Comment puis-je envoyer un URLRequest vide? Je veux dire, dans le cas de "si laissez" la condition d'échec? –

+0

Vous pouvez renvoyer un URLRequest vide, mais vous ne recevrez aucune réponse de votre serveur, ma réponse a été modifiée –