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中无法完成的吗?
你想要的配方不起作用的原因是你试图用一个单独打开两个选项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>- 如果你可以让你的字典类型更具体,你将不再需要这样做.