2015-04-30 153 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] 
相关问题