[英]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.