我有一个使用Foursquare API下载JSON数据的应用程序。我使用NSURLSession
和dataTaskWithRequest
完成块方法来获取数据。我得到的数据很好,但有时名为groups
的嵌套数组可能为空。当我通过下面的JSON解析时,由于某种原因,我的条件语句不像我期望的那样处理空数组。而不是将数组评估为空并继续前进到if let...else
语句的“else”部分,而不是通过运行时错误说明:index 0 beyond bounds of empty array
if let response: NSDictionary = data["response"] as? [String: AnyObject],
groups: NSArray = response["groups"] as? NSArray,
// Error here \|/ (sometimes groups array is empty)
dic: NSDictionary = groups[0] as? NSDictionary,
items: NSArray = dic["items"] as! NSArray {
}
else {
// Never gets here. Why?
// IF the groups array is empty, then the if let should return
// false and drop down to the else block, right?
}
我对Swift比较新,有人可以告诉我为什么会这样,我能做些什么来解决这个问题?感谢
答案 0 :(得分:4)
如果数组为空,则必须在if let
语句之外显式检查,因为
空数组绝不是可选的
if let response = data["response"] as? [String: AnyObject], groups = response["groups"] as? NSArray {
if !groups.isEmpty {
if let dic = groups[0] as? NSDictionary {
items = dic["items"] as! NSArray
// do something with items
println(items)
}
}
} else ...
您可以在向下转换类型时省略所有类型注释
但是,您可以使用where子句执行检查,这适用于Swift 1.2和2
if let response = data["response"] as? [String: AnyObject],
groups = response["groups"] as? [AnyObject] where !groups.isEmpty,
let dic = groups[0] as? NSDictionary,
items = dic["items"] as? NSArray {
// do something with items
println(items)
} else {...
答案 1 :(得分:0)
在陈述之间使用&&
运算符。
例如,这不会崩溃:
var a = 4;
var c = 5;
var array = Array<Int>();
if a > 2 && c > 10 && array[0] != 0 {
}
答案 2 :(得分:0)
在尝试访问数组之前,请确保该数组不为空:
if let response: NSDictionary = data["response"] as? [String: AnyObject],
let groups: NSArray = response["groups"] as? NSArray where groups.count > 0 {
if let dic: NSDictionary = groups[0] as? NSDictionary,
let items: NSArray = dic["items"] as? NSArray {
// Do something..
return // When the 2nd if fails, we never hit the else clause
}
}
// Do logic for else here
...