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

How to assign an array element which can be null in Swift?

在我的 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
          }
      }
  }

如果数组和第一个元素存在,它会工作,但我遇到 "index 0 beyond bounds for empty array" 崩溃,即使元素分配在 if let 包装内。

我做错了什么?我对 Swift 选项、打字和疯狂 if let wrapping 无处不在感到疯狂...

你可以用这个

var a = [Any?]()
a.append(nil)

如果你有一个带有 AnyObject 的非可选数组,你可以使用 NSNull(就像在 Obj-C 中一样)

错误与 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属性

The first object in the array. (read-only)

If the array is empty, returns 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)
}