在我的Swift应用程序中,我正在查询api返回一个像这样的json对象:
{
key1: value1,
key2: value2,
array : [
{
id: 1,
string: "foobar"
},
{
id: 2,
string: "foobar"
}
]
}
事实:
在Swift中我正在做:
if let myArray: NSArray = data["array"] as? NSArray {
if let element: NSDictionary = myArray[0] as? NSDictionary {
if let string: NSString = element["string"] as? NSString {
// i should finally be able to do smth here,
// after all this crazy ifs wrapping
}
}
}
如果数组和第一个元素存在,它可以工作,但是我遇到了“索引0超出空数组边界”的崩溃,即使元素赋值在if let包装内也是如此。
我在这里做错了什么?如果让包装到处都是我疯狂的Swift可选项,打字和疯狂......
答案 0 :(得分:1)
您可以使用此
var a = [Any?]()
a.append(nil)
如果你有一个带有AnyObject
的非可选数组,你可以使用NSNull
(就像在Obj-C中一样)
答案 1 :(得分:1)
错误与Optional
无关。如果对数组使用订阅([]
),则必须检查其长度。
if let myArray: NSArray = data["array"] as? NSArray {
if myArray.count > 0 { // <- HERE
if let element: NSDictionary = myArray[0] as? NSDictionary {
if let string: NSString = element["string"] as? NSString {
println(string)
}
}
}
}
但我们有方便的.firstObject
属性
数组中的第一个对象。 (只读)
如果数组为空,则返回nil。
使用此:
if let myArray: NSArray = data["array"] as? NSArray {
if let element: NSDictionary = myArray.firstObject as? NSDictionary {
if let string: NSString = element["string"] as? NSString {
println(string)
}
}
}
而且,我们可以使用"Optional Chaining"语法:
if let str = (data["array"]?.firstObject)?["string"] as? NSString {
println(str)
}