动态转换类在SWIFT中解析json的无条件问题

时间:2015-01-21 22:06:36

标签: ios json swift int dynamic-cast

我有一个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时会出现问题,但为什么它会对第一张图片有效?

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

1 个答案:

答案 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()