我有一个json,它很复杂,但我需要获得一些图片的宽度。
我在json中有12张图片。 前10名的一切都运作良好,但我在11日遇到了崩溃。
"sizes": [
{ "height": "2932",
"url": "myurl",
"width": "645"
},
我的代码是:
var width : Int!
if let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data,options:nil,error: nil) {
if jsonResult is NSDictionary {
if let allPosts = jsonResult["posts"] as? NSArray { // récup tous les posts dans l'Array allPosts
for posts in allPosts {
if let jsonMedia = posts["media"] as? NSArray {
if let allMetaSizes = jsonMedia[0]["sizes"] as? NSArray {
for sizes in allMetaSizes {
if size=="full" { // image taille normale
width = sizes["width"] as Int //CRASH
}
}
}
}
}
}
}
}
我明白了:
EXC_BREAKPOINT (code=EXC_i386...)
swift_dynamicCastObjCClassUnconditional
我认为将AnyObject转换为Int时会出现问题,但为什么它会对第一张图片有效?
我找不到如何解决这个问题。
答案 0 :(得分:0)
该错误可以解释为width
字典中找不到的sizes
密钥,或者Int
类型的相应值。
快速解决方法是避免强制转换,并将其替换为条件转换 - 需要将width
转换为可选项:
var width : Int?
if let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data,options:nil,error: nil) {
if jsonResult is NSDictionary {
if let allPosts = jsonResult["posts"] as? NSArray { // récup tous les posts dans l'Array allPosts
for posts in allPosts {
if let jsonMedia = posts["media"] as? NSArray {
if let allMetaSizes = jsonMedia[0]["sizes"] as? NSArray {
for sizes in allMetaSizes {
if size=="full" { // image taille normale
width = sizes["width"] as? Int
}
}
}
}
}
}
}
}
现在width
可以包含有效的Int
值或nil
- 只需使用可选绑定即可在nil
时执行您需要执行的操作:
if let width = width {
... do something with width
}
但是我建议你在导致异常的行上设置断点,找出强制转换失败的原因 - 或者,你可以打印它:
println(sizes["width"])
附录如果字典中包含的值是字符串类型,请尝试替换此行:
width = sizes["width"] as? Int
与
let strWidth = sizes["width"] as? String
width = strWidth?.toInt()