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