我只想问一下如何在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/