我有一个 json,很复杂,但我需要得到一些图片的宽度。
我有 12 图像在 json。 一切就会正常第 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
我想这是一个问题,当我强制转换为 Int,AnyObject 但是为什么它不工作为第一张图片吧?
找不到如何解决这个问题。
错误可以被解释为 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()