我认为它与选项有关,但我很安全地解包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
}
答案 0 :(得分:4)
只要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...
}