2016-12-15 2 views
1

Je veux juste demander comment gérer le retour JSON avec des valeurs nulles dans Swift. J'ai utilisé la garde pour déballer les valeurs, mais si le JSON a une valeur nulle comme dans l'exemple ci-dessous, la garde ne sera pas exécutéeComment gérer la réponse JSON avec nil en utilisant guard dans Swift

Je veux aussi savoir comment utiliser un garde. Est-il acceptable d'utiliser plusieurs conditions dans un garde? Comme dans mon exemple de code ci-dessous?

{ 
    "error_code": "0", 
    "error_description": [], 
    "status": true, 
    "results": { 
    "id": 25, 
    "email": "[email protected]", 
    "created_at": "2016-12-10T15:54:03.779Z", 
    "updated_at": "2016-12-15T06:41:49.432Z", 
    "first_name": "Juan", 
    "last_name": "Cruz", 
    "middle_name": "Dela", 
    "nickname": "joe", 
    "option_nickname": null, 
    "age": 24, 
    "gender": "Male", 
    "mobile_number": "639959283721", 
    "photo_url": { 
    "url": null 
    }, 
    "school": "University of the Philippines", 
    "user_address": null, 
    "city": "Quezon City", 
    "country": null, 
    "longtitude": 121.0621301, 
    "latitude": 14.5832954, 
    "facebook_user_id": null, 
    "device_token": null, 
    "token": "YrxVEWUMYxieFy7PEsAn", 
    "is_sent": false, 
    "show_nickname": false 
}, 
"error": [] 

}

Voici mon code:

func UserLogin(facebookID: String) -> Void { 
    UIApplication.shared.isNetworkActivityIndicatorVisible = true 
    let urlString = Constants.baseURL + Constants.apiURL + Constants.loginUrl 
    let params:Dictionary<String, AnyObject> = [ 
     "facebook_id": facebookID as AnyObject 
    ] 

    Alamofire.request(urlString, method: .post, parameters: params, encoding: JSONEncoding.default) 
     .validate() 
     .responseJSON { response in 
      switch response.result { 
      case .success: 
       let userjson = JSON(data: response.data!) 
       let results = userjson["results"].dictionaryValue 
       guard let auth_token = results["token"]?.string, 
        let userid = results["id"]?.int, 
        let firstname = results["first_name"]?.string, 
        let lastname = results["last_name"]?.string, 
        let nickname = results["nickname"]?.string, 
        let city = results["city"]?.string, 
        let photo = results["photo_url"]?["url"]else{ 

         //nil 
        return 
       } 

       //The Process will not continue from here if the JSON response has a null value) 

       self.userdefault.saveUserToken(authToken: auth_token) 
       self.userdefault.setUserID(userID: userid) 
       self.userdefault.setuserFirstName(userFName: firstname) 
       self.userdefault.setuserLastName(userLName: lastname) 
       self.userdefault.setuserNickName(userNName: nickname) 
       self.userdefault.setuserCity(userCity: city) 

       self.GotoMainNavigation() 

      case .failure(let error): 
       print("susb \(error)") 

       self.getFacebookInfo() 

      } 
      UIApplication.shared.isNetworkActivityIndicatorVisible = false 
    } 

} 

Merci

Répondre

0

Votre expression guard est parfaitement bien et filtre toutes les valeurs null sauf dans la dernière ligne. En supposant que le url est aussi une chaîne que vous devez vérifier

let photo = results["photo_url"]?["url"]?.string ... 

mais considérer que l'expression guard ne sera évaluée à true si toutes fixations en option réussir.

Par exemple, si la valeur photo est censé être mis en option, il après l'expression de garde et utiliser l'opérateur coalescent nul:

let photo = results["photo_url"]?["url"]?.string ?? "" 
0
data =  { 
     results =   { 
      resultsData =    (
           { 
        a = "A"; 
        b = "B"; 
        c = "C": 
       } 
      ); 
     }; 
}; 

garde est une nouvelle instruction conditionnelle qui exige l'exécution de quitte le bloc courant si la condition n'est pas remplie. Toutes les nouvelles liaisons facultatives créées dans l'état d'une instruction de garde sont disponibles pour le reste de la fonction ou du bloc, et l'autre obligatoire doit quitter la portée actuelle, en utilisant retour pour quitter une fonction, continuer ou rompre dans une boucle ou un retour fonction

guard let data = response["data"] as? [String:AnyObject],let resultsObj = response["results"] as? [String:AnyObject],let resultsData = results["resultsData"] as? [String:AnyObject] else{ 

    return 
} 
+0

et si "a" est null? Est-ce qu'un gardien renvoie l'autre valeur? – vidalbenjoe

+0

Vérifiez ceci: - [http://stackoverflow.com/questions/34051886/swift-guard-else-called-on-dictionary-key-with-null-value] – nick

+0

@vidalbenjoe marquez si cela vous est utile – nick