如何在Swift中分配一个可以为null的数组元素?

时间:2015-02-02 11:55:56

标签: ios swift optional

在我的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可选项,打字和疯狂......

2 个答案:

答案 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)
}