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

Mat*_*lly 3 dictionary downcast swift

我正在尝试访问一个元素一个字典元素,并将其向下转换为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 {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

if let x = dict["key"] as? String {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ook 7

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

if let x = dict["key"]! as? String {
    println(x)
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果dict["key"]最终存在nil,强制解包将使您的应用程序崩溃.最好这样做(你可以跳过第一个if),即使这是一个额外的步骤:

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

额外的步骤只是使用的成本Dictionary<String, AnyObject>- 如果你可以让你的字典类型更具体,你将不再需要这样做.