ios - Swift 下标错误

标签 ios swift dictionary option-type 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

        }

最佳答案

从 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 是一个字典,其中包含“source”键,step2 将是相应的值。
  • 如果step1是一个字典没有“源”键,step2将为nil — 特别是,它是 AnyObject??.Some(AnyObject?.None)
  • 如果 step1 为 nil(原始字典没有 0 作为键),或者不是字典(它有一个 0 键和其他类型的值),则 step2 将是 nil — 特别是 AnyObject??.None

(最后两种情况之间的区别大多不重要,您不必担心,但如果您有兴趣,可以使用 dump 查看它)。

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

let step3 = step2??["sourceUrl"] // step3 is AnyObject?? again

现在,将它们全部绑定(bind)在一个 if 中:

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

警告

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

let dict: NSDictionary = [0: ["source": [3: "result"]]]

dict[0]?["source"]??[3] // returns nil (surprise!)
dict[0]?["source"]??[3 as NSNumber] // returns "result"

let dict2: NSDictionary = [0: ["source": [8, 7, 6, 5, 4]]]

dict2[0]?["source"]??[3] // returns 5
dict2[0]?["source"]??[3 as NSNumber] // returns nil (surprise!)

关于ios - Swift 下标错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623244/

相关文章:

ios - 如何使用 Swift 以编程方式使用交替条纹图案填充 UIView?

ios - 是否可以下载 swift 文件并将其保存在路径中,并从中呈现 UI。?

swift - Dictionary 类型的计算属性的 Setter

python - 如何在python中将一个键对值从一个字典复制到另一个字典

jquery - 使用 Jquery Maphilight 插件更改单击区域的填充颜色

ios - 内存警告和未使用的图像资源

ios - 将 UITextView 属性字符串保存到 SwiftUI 中的文件

ios - 使用 UICollectionViewCell 上的按钮显示数组中的数据

ios - Swift - 布局 - 拉伸(stretch) UILabel

ios - SwiftUI 中 NavigationView 中后退按钮的默认文本