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

标签 ios json swift null swift3

我只想问一下如何在Swift中处理空值的JSON返回。 我使用 guard 来解包值,但是如果 JSON 具有如下示例中的 null 值,则不会执行 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
    }

}

谢谢

最佳答案

您的 guard 表达式非常好,可以过滤除最后一行之外的所有 null 值。假设 url 也是您必须检查的字符串

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

但考虑到 guard 表达式只有在所有 可选绑定(bind)成功时才会被评估为真。

例如,如果 photo 值应该是可选的,则将其放在 守卫表达式之后并使用 nil 合并运算符:

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

关于ios - 如何在 Swift 中使用 guard 使用 nil 处理 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41158330/

相关文章:

sql - 将 JSON 结果连接到单列 postgresql

javascript - D3 : use nest function to turn flat data with parent key into a hierarchy

json - Swift - 使用 Decodable 解码仅包含字符串的 JSON 数组

ios - 快速从视频中提取帧

ios - 旧学校类(class)开始

java.sql.TimeStamp 没有默认构造函数

ios - 在 tableView 中显示数组

swift - 无法打开依赖文件 Swift 4.2

c# - Xamarin.Forms:使用 GetMainPage()

ios - 无法点击嵌入在 UIPageViewController (ScrollStyle) 中的 UITableView - didSelectRowAtIndexPath 未触发