Dictionary 在Swift中读取字典时的向下转换元素
我试图访问字典元素中的一个元素,并将其向下转换为除AnyObject以外的其他类型,但始终得到相同的编译器错误: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
找不到接受所提供参数的“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”与任何对象都不相同
谢谢,这是有道理的。我没有想到我会创建两个选项这对我不起作用,尽管这似乎是一个合乎逻辑的解决方案