2017-10-12 11 views
1

Je suis en train de se connecter au serveurréférence à un membre Ambigu « dataTask (avec: completionHandler :) » se connecter au serveur

S'il vous plaît si vous avez obtenu une solution écrire pour moi

comment puis-je savoir ce que changements dans la nouvelle version de swift?

beaucoup de différences existent entre 2 rapide et rapide 3

est rapide 4 très différent de 3 rapide?

dans rapide 3 je reçois cette erreur:

let task = URLSession.shared.dataTask(with: server.execute()) 
{Data,URLResponse,error in 
    if error != nil{ 
    print(error as Any) 
     return 
    } 
    do{ 
     let json = try JSONSerialization.jsonObject(with: Data!, options: .allowFragments) 
     if let json_result = json as? [String: Any] 
     { 
      let result = json_result ["result"] as? String 
      if result == "0" 
      { 
       DispatchQueue.main.async { 
        let alert = UIAlertController(title:"Incorrect Username",message : "The username you entered doesn't appear to belong to an account. Please check your username and try again", preferredStyle : .alert) 
        let alert_action = UIAlertAction(title: "Try Again", style: .default, handler: nil) 
        alert.addAction(alert_action) 
        self.present(alert, animated: true, completion: nil) 
       } 
      } 
      else 
      { 
       DispatchQueue.main.async { 
        UserDefaults.standard.set(result!, forKey: "user_id") 
        //" use of unresolved identifier 'result' " 
        let current_view=UIApplication.shared.windows[0] as UIWindow 
        let new_view=(self.storyboard? .instantiateViewController(withIdentifier: "tab_bar"))! as UIViewController 
        UIView.transition(from: (current_view.rootViewController? .view)!, to:new_view.view , duration: 0.65, options: .transitionFlipFromRight, completion: {(action) in current_view.rootViewController=new_view 
        }) 
       } 

      } 
     } 
     else{ 
      // Error in jsonSerialization 
     } } 
    catch{ 
    } 
} 
task.resume() 

Répondre

0

Le problème est presque certainement la valeur de retour de server.execute(). Peut-être que c'est un NSURL ou NSURLRequest plutôt que URL ou URLRequest. Peut-être que c'est un optionnel. Peut-être que c'est quelque chose de complètement différent. Bottom line, si le paramètre à dataTask n'est pas un URL non optionnel ou URLRequest, vous pouvez obtenir l'erreur que vous avez faite. Sans voir ce que execute revient, nous ne faisons que deviner, mais c'est le coupable probable.


Quelques observations non liées:

  1. Je ne voudrais pas utiliser Data ou comme noms de paramètres à la fermeture dataTask. Ce sont les noms des types de données. Je voudrais utiliser data et response (ou même ne pas spécifier response parce que vous ne l'utilisez pas), à la place, pour éviter toute confusion (pour vous et le compilateur).

  2. Vous avez beaucoup de conversions externes qui ajoutent seulement du bruit au code. Par exemple. windows est un tableau de UIWindow, alors pourquoi s'embêter à faire as UIWindow lorsque vous obtenez le premier élément de ce tableau.

  3. Vous avez quelques séquences de chaînage facultatives que vous forcez plus tard à déballer. Cela ne sert à rien de le faire. Éliminer le chaînage optionnel dans ce processus. Ainsi, au lieu de storyboard? suivi ! plus tard:

    let new_view = (self.storyboard?.instantiateViewController(withIdentifier: "tab_bar"))! as UIViewController 
    

    Vous pouvez simplement utiliser storyboard!:

    let controller = self.storyboard!.instantiateViewController(withIdentifier: "tab_bar") 
    
  4. Vous avez deux options étrangères que vous pouvez supprimer si vous voulez. Par exemple. .allowFragments pour JSONSerialization est inutile (et probablement indésirable). Ou un completion de nil pour votre UIAlertAction et present est inutile, aussi. Pas une grosse affaire, mais cela ajoute du bruit à votre code.

  5. Par convention, nous n'utilisons pas _ caractères pour séparer les mots dans un nom de variable. Nous utilisons camelCase. Ainsi, par exemple, plutôt que current_view, nous utiliserions currentView. (Ou, parce que c'est une fenêtre, j'utiliserais effectivement window, ce qui est encore plus simple.)

  6. Il n'y a pas d'intérêt à utiliser do - try - modèle catch si vous ne faites rien dans le bloc catch. Pourquoi lancer une erreur si vous ne faites rien quand vous l'attrapez. Utilisez simplement try? si tout ce qui vous intéresse est de savoir si cela a réussi ou non.

Ainsi, le code peut être nettoyé un peu à quelque chose comme:

let task = URLSession.shared.dataTask(with: request) { data, _, error in 
    if let error = error { 
     print(error) 
     return 
    } 

    guard let data = data, 
     let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any], 
     let result = json["result"] as? String else { 
      print("no result") 
      return 
    } 

    DispatchQueue.main.async { 
     if result == "0" { 
      let alert = UIAlertController(title: "Incorrect Username", message: "The username you entered doesn't appear to belong to an account. Please check your username and try again", preferredStyle: .alert) 
      let action = UIAlertAction(title: "Try Again", style: .default) 
      alert.addAction(action) 
      self.present(alert, animated: true) 
     } else { 
      UserDefaults.standard.set(result, forKey: "user_id") 
      let window = UIApplication.shared.windows[0] 
      let controller = self.storyboard!.instantiateViewController(withIdentifier: "tab_bar") 
      UIView.transition(from: window.rootViewController!.view, to: controller.view, duration: 0.65, options: .transitionFlipFromRight, completion: { _ in 
       window.rootViewController = controller 
      }) 
     } 
    } 
} 
task.resume() 

Maintenant, je l'ai remplacé server.execute() avec request parce que je ne sais pas ce que execute est en train de faire, mais l'utilisation tout ce qui est approprié (voir le début de cette réponse).