在Swift中从Dictionary中读取时的Downcast元素

时间:2014-06-20 13:17:27

标签: dictionary swift downcast

我正在尝试访问一个元素一个字典元素并将其向下转换为AnyObject以外的类型,但不断得到相同的编译器错误:Could not find an overload for 'subscript' that accepts the supplied arguments

我知道我可以使用两个if语句来执行此操作:

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

但我觉得必须有比这更优雅的解决方案。对我来说最有意义的格式是:

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

但这只会导致错误,如上所述。我已经尝试了几十种变体,但似乎没有任何差异。这是在Swift中无法完成的事情吗?

3 个答案:

答案 0 :(得分:7)

您所需的配方不起作用的原因是您尝试使用单个as?打开两个选项。有两个Optionals,因为您的字典的下标和尝试转换为String都会返回可选值。没有办法在一个运行时安全的if语句中执行此操作,但有一种方法:

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

问题是,如果dict["key"]最终为nil,则强制解包会导致您的应用崩溃。最好这样做(你可以跳过第一个if),即使这是一个额外的步骤:

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

额外的步骤只是使用Dictionary<String, AnyObject>的成本 - 如果您可以更准确地获得字典类型,则不必再这样做了。

答案 1 :(得分:0)

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

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

}

它既安全又紧凑。

答案 2 :(得分:0)

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

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