2016-12-15 1 views
1

Hier, j'ai mis à jour à Xcode 8.2 qui m'a forcé à mettre à jour à la syntaxe Swift 3.0. Dans mon application, j'ai cette fonction:Problèmes avec Swift3: ne peut pas comprendre la nouvelle syntaxe

func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) 
{ 
    let request = NSMutableURLRequest(url: targetURL) 
    request.httpMethod = "GET" 

    let sessionConfiguration = URLSessionConfiguration.default 

    let Session = URLSession(configuration: sessionConfiguration) 

    let tasksession = Session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: NSError?) -> Void in 
     if data != nil{ 
      DispatchQueue.main.async(execute: {() -> Void in 
      completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)}) 
     } 
     else 
     { 
      print("Connection Lost") 
     } 

    }) 
    tasksession.resume() 
} 

Et je reçois cette erreur:

Cannot invoke 'dataTask' with an argument list of type '(with: NSMutableURLRequest, completionHandler: (Data?, URLResponse?, NSError?) -> Void)'

S'il vous plaît, que quelqu'un me aider à corriger?

+0

Xcode 8.2 ne vous force pas à mettre à jour vers Swift 3.0, vous pouvez toujours utiliser Swift 2.3. Mais Xcode 8.3 vous forcera à passer à Swift 3.x. –

Répondre

2

Pour Swift 3, il est Batte si vous vérifiez Apple Documentation, maintenant dataTask(with:completionHandler:) prendra URLRequest comme premier argument et le completionHandler est changé en (Data?, URLResponse?, Error?) -> Void. Donc faire une instance de URLRequest au lieu de NSMutableURLRequest et fait des changements de completionHandler aussi. Dans Swift 3 avec la plupart de l'API publique, ils ont changé NSError en Error. Donc pâte si vous utilisez Error aussi.

func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: Error?) -> Void) { 

    let request = URLRequest(url: targetURL) 
    request.httpMethod = "GET" 

    let sessionConfiguration = URLSessionConfiguration.default 

    let Session = URLSession(configuration: sessionConfiguration) 

    let tasksession = Session.dataTask(with: request) { data, response, error in 
     if data != nil{ 
      DispatchQueue.main.async { 
       completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error) 
      } 
     } 
     else 
     { 
      print("Connection Lost") 
      DispatchQueue.main.async { 
       completion(data: nil, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error) 
      } 
     } 

    } 
    tasksession.resume() 
} 

Note: Vous devez appeler votre completionHendler avec tous les moyens possibles, vous ne l'avez pas appelé lorsque vous recevez des données nil vous devez appeler à l'intérieur du bloc else aussi avec nil en tant que valeur de données.

Editer: Vous pouvez appeler cette fonction comme ceci.

self.performGetRequest(url) { (data, status, error) in 
    if error != nil { 
     print(error?.localizedDescription) 
     return 
    } 
    //Use data here 
} 
+0

Merci @Nirav D beaucoup pour votre aide mais j'ai un autre problème comment puis-je appeler cette fonction effectuerGetRequest Merci encore – bero

+0

@bero Actuellement Mac n'est pas disponible, vous aidera demain. –

+0

D'accord pas de problème je vous attends et merci beaucoup pour votre aide – bero