如何在Swift中使用guard使用nil处理JSON响应

时间:2016-12-15 07:07:20

标签: ios json swift null swift3

我只想问一下如何在Swift中使用null值处理JSON返回。 我使用guard来解包值,但是如果JSON的空值如下例所示,则不会执行guard

我也想知道使用警卫的正确方法。在一个警卫中使用多个条件是否可以?就像我下面的示例代码一样?

{
  "error_code": "0",
  "error_description": [],
  "status": true,
  "results": {
  "id": 25,
  "email": "jaundelacruz@yahoo.com",
  "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
    }

}

谢谢

2 个答案:

答案 0 :(得分:0)

您的guard表达式完全正常,并会过滤除最后一行之外的所有null值。假设url也是一个字符串,你必须检查

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

但请注意,只有所有可选绑定成功时,guard表达式才会被评估为true。

例如,如果photo值应该是可选的,则在保护表达式后使用并使用nil合并运算符:

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

答案 1 :(得分: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
 }