Dynamic Cast Class 无条件问题解析 json in SWIFT
Dynamic Cast Class Unconditional issue parsing json in SWIFT
我有一个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 时出现问题,但为什么它适用于第一张图片?
我找不到解决方法。
该错误可以解释为 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"])
Addendum 如果字典中包含的值是字符串类型,尝试替换这一行:
width = sizes["width"] as? Int
与
let strWidth = sizes["width"] as? String
width = strWidth?.toInt()
我有一个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 时出现问题,但为什么它适用于第一张图片?
我找不到解决方法。
该错误可以解释为 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"])
Addendum 如果字典中包含的值是字符串类型,尝试替换这一行:
width = sizes["width"] as? Int
与
let strWidth = sizes["width"] as? String
width = strWidth?.toInt()