Swift下标错误

时间:2015-07-25 05:20:21

标签: ios swift dictionary optional subscript

我认为它与选项有关,但我很安全地解包sourceURL所以我仍然不确定错误在哪里!我正在尝试访问JSON对象的数组的字典值。

但是,我仍然得到“无法找到接受所提供参数的'下标'的重载。

看起来很简单,但我似乎无法弄明白!

        var dictTemp: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &localError) as? NSDictionary
        var finalURL: String
        // error line below
        if let sourceURL = dictTemp[0]["source"]["sourceUrl"] as? NSString {
            finalURL = sourceURL as String

        }

1 个答案:

答案 0 :(得分:4)

从Swift访问的NSDictionary是一个有趣的野兽。

只要Swift只知道某个东西是NSDictionary(不是更具体的[Key: Value] Swift风格的字典),你只能从中检索AnyObject?

let dictTemp: NSDictionary = // from somewhere...

let step1 = dictTemp[0]  // step1 is an AnyObject?

但是,既然你已经导入了Foundation,你可以继续使用一个适用于AnyObject的魔术下标运算符,并检查该东西是否是字典:

let step2 = step1?["source"] // step2 is any AnyObject??

这里有趣的地方,因为

  • 如果step1是带有"来源的字典"在其中的密钥,step2将是相应的值。
  • 如果step1是字典 没有 a"来源"密钥,step2将为nil - 特别是AnyObject??.Some(AnyObject?.None)
  • 如果step1为nil(原始字典没有0作为键),或者不是字典(它有一个带有其他类型值的0键),那么{{1}将step2 - 特别是nil

(最后两个案例之间的区别大多不重要,您不应该担心它,但如果您对此感兴趣,可以使用AnyObject??.None)来查看。

当然,我们可以再次应用相同的原则:

dump

现在,将它们全部绑定在一个let step3 = step2??["sourceUrl"] // step3 is AnyObject?? again 中:

if

买者

这种语法可能很危险,因为它同时适用于数组和字典。在这些情况下你会期待什么?

if let url = dictTemp[0]?["source"]??["sourceUrl"] as? String {
    // do something with url...
}