【问题标题】:Swift Subscript ErrorSwift 下标错误
【发布时间】:2015-07-25 13:58:05
【问题描述】:

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

但是,我仍然收到“找不到接受提供的参数的 'subscript' 的重载。

看起来很简单,但我就是想不通!

        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

        }

【问题讨论】:

  • dictTemp是什么类型?
  • 顺便说一句,as? NSString ... as String 不是必需的。你可以使用as? String
  • @jtbandes 添加到问题中。谢谢!
  • 真的吗?我仍然看到错误。不过,我相信你可以使用dictTemp[0]?["source"]??["sourceURL"]。有点拗口。
  • @jtbandes 不,你是对的。抱歉,我激动了一秒钟,我认为 xcode 在给我一个新的错误消息时速度很慢。会试试谢谢

标签: ios swift dictionary optional subscript


【解决方案1】:

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

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

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 是字典没有“源”键,step2 将是nil — 特别是AnyObject??.Some(AnyObject?.None)。李>
  • 如果step1 为nil(原始字典没有0 作为键),或者不是字典(它有一个带有其他值的0 键),那么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...
}

警告

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

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!)

【讨论】:

  • 不过,为什么要使用 AnyObject?从下标返回一个双可选,而字典?从下标返回单个可选?我想我很难理解为什么会这样,除了语言设计者的疏忽。
  • 可能是因为 Dictionary 总是可以查询键,而 AnyObject 甚至可能根本不是 NSDictionary 或 NSArray。不过我同意,这似乎很奇怪。
猜你喜欢
  • 2023-04-06
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2017-08-09
  • 2023-03-22
相关资源
最近更新 更多