Dictionary 在Swift中读取字典时的向下转换元素

Dictionary 在Swift中读取字典时的向下转换元素,dictionary,swift,downcast,Dictionary,Swift,Downcast,我试图访问字典元素中的一个元素,并将其向下转换为除AnyObject以外的其他类型,但始终得到相同的编译器错误:找不到接受所提供参数的“subscript”的重载 我知道我可以用两个if语句来实现这一点,比如: if let x = dict["key"] { if let y = x as? String { // ... } } 但我觉得必须有一个比这更优雅的解决方案。对我来说最有意义的格式是: if let x = dict["key"] as? Stri

我试图访问字典元素中的一个元素,并将其向下转换为除AnyObject以外的其他类型,但始终得到相同的编译器错误:
找不到接受所提供参数的“subscript”的重载

我知道我可以用两个if语句来实现这一点,比如:

if let x = dict["key"] {
    if let y = x as? String {
        // ...
    }
}
但我觉得必须有一个比这更优雅的解决方案。对我来说最有意义的格式是:

if let x = dict["key"] as? String {
    // ...
}

但这只会导致上面提到的错误。我尝试过几十种不同的方法,但似乎都没有什么不同。这是Swift无法做到的吗?

您想要的公式不起作用的原因是您试图用一个
作为打开两个选项。有两个选项,因为字典的订阅和尝试转换为
String
都返回可选值。没有一种方法可以在一个
if
语句中实现运行时安全,但有一种方法:

if let x = dict["key"]! as? String {
    println(x)
}
问题是,如果
dict[“key”]
最终为
nil
,强制展开将使应用程序崩溃。这样做更好(如果
,可以跳过第一个
),即使这是一个额外的步骤:

let x: AnyObject? = dict["key"]
if let y = x as? String {
    println(y)
}

额外的步骤只是使用
字典的成本-如果你能让你的字典类型更具体,你就不必再做了。

我也在努力解决这个问题,但后来我发现可选链接是解决方案。只用

if let x = dict["key"]? as? String {
      println(x)
}


它为您提供了安全性和紧凑性。

最后,我不得不使用这种单线解决方案:

    if let name = jsonDict["name"] as AnyObject? as? String {
        println("name is \(name)")
    } else {
        println("property was nil")
    }

在你取消引用词典之前,你是否试过将它转换成文本?如果字典不是同质的,我不确定它是否有效,但值得一试。我有,我得到的错误是,
“String”与任何对象都不相同
谢谢,这是有道理的。我没有想到我会创建两个选项这对我不起作用,尽管这似乎是一个合乎逻辑的解决方案