我正在尝试访问一个元素一个字典元素并将其向下转换为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中无法完成的事情吗?
答案 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")
}