动态铸班无条件问题解析 json 中SWIFT

标签: json ios Swift
发布时间: 2017/3/4 21:41:31
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个 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 但是为什么它不工作为第一张图片吧?

找不到如何解决这个问题。

解决方法 1:

错误可以被解释为 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()
赞助商