2015-04-30 87 views
6

所以我試圖用swift解析JSON中的一些數據。下面是我的代碼Swift中的NSDictionary:無法下標'AnyObject'類型的值與'Int'類型的索引

var jsonResult:NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary 

println(jsonResult) 

上面的代碼將返回這樣的事情

{ 
count = 100 
subjects = (
     { 
     alt = "....." 
     name = "....." 
     }, 
     { 
     alt = "....." 
     name = "....." 
     }, 

     ...... 
     ) 
} 

後來我嘗試訪問所有的受試者jsonResult["subjects"],到目前爲止好 但是,當我嘗試訪問個人主題,例如jsonResult["subjects"][0],Xcode給我錯誤: Cannot subscript a value of type 'AnyObject?' with an index of type 'Int' 有人可以幫助我嗎?

回答

7

當您爲字典下標時,如jsonResult["subjects"],您將獲得一個可選項。您需要解包可選。而且,因爲這個字典是從JSON到達的,所以Swift不知道Optional包含了什麼類型的東西:它被鍵入爲AnyObject - 這就是爲什麼Swift將Optional描述爲AnyObject?。所以你也告訴斯威夫特真的是什麼類型的對象是 - 它是一個字典數組,你需要告訴斯威夫特,否則你將不能用[0]來表示它。

你都可以做這些事情在一個單一的舉動,就像這樣:

if let array = jsonResult["subjects"] as? [[NSObject:AnyObject]] { 
    let result = array[0] 
    // ... 
} 

如果你是非常,非常肯定你的理由,你可以強制解纏和鑄件,並減少到單行,如下:

let result = (jsonResult["subjects"] as! [[NSObject:AnyObject]])[0] 

但我不能推薦。可能會出錯的方式太多了。

+0

謝謝,完全正常 – JSNoob

0

你應該嘗試像,

var jsonResult:NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary 
let subjhectarry : NSArray = jsonResult["subjects"] as! NSArray 
let yourFirstObj : NSDictionary = subjhectarry[0] as! NSDictionary 

願這幫助你。

2

至少用Swift 2,你可以用jsonResult [「subject」]做! [AnyObject]

let data = try NSJSONSerialization.JSONObjectWithData(textData!, options: NSJSONReadingOptions.AllowFragments) 
let results = data["results"] as! [AnyObject] 
let first = results[0] 
相關問題