簡體   English   中英

SWIFT中的動態Cast類無條件問題解析json

[英]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時會出現問題,但是為什么它對第一張圖片有效?

我沒有找到解決方法。

該錯誤可以解釋為在sizes字典中找不到的width鍵,或者不是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對其進行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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM