2016-12-15 56 views
1

我只想問如何處理在Swift中的空值的JSON返回。 我用警衛來展開這些值,但是如果JSON的值如下例所示,那麼警衛將不會執行如何處理JSON響應與無使用警衛在Swift

我也想知道使用警衛的正確方法。在一名警衛中使用多重條件可以嗎?就像我在下面的示例代碼?

{ 
    "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": [] 

}

這裏是我的代碼:

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 
    } 

} 

謝謝

回答

0

guard表達是完全正常的,並過濾除最後一行的所有null值。假設url也是你必須檢查

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

但認爲guard表達纔會被評估爲true,如果所有可選綁定成功的字符串。

例如,如果photo值應該是可選的放它保護表達後,使用無合併運算符:

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

後衛是一個新的條件語句,需要執行,以如果條件不符合,則退出當前塊。在guard語句的條件中創建的任何新的可選綁定都可用於該函數或塊的其餘部分,而強制的else必須退出當前作用域,方法是使用return返回一個函數,繼續或斷開循環或@noreturn函數

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

如果「a」爲空,該怎麼辦?警衛是否會返回其他值? – vidalbenjoe

+0

檢查此: - [http://stackoverflow.com/questions/34051886/swift-guard-else-called-on-dictionary-key-with-null-value] – nick

+0

@vidalbenjoe標記它,如果它對你有幫助 – nick