ios – Swift中的NSDictionary:不能下标“AnyObject”类型的值吗?索引类型为’Int’

所以我试图使用 swift解析 JSON中的一些数据.下面是我的代码
var jsonResult:NSDictionary! = NSJSONSerialization.JSONObjectWithData(data,options: NSJSONReadingOptions.MutableContainers,error: nil) as! NSDictionary

println(jsonResult)

上面的代码将返回这样的内容

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

然后我尝试使用jsonResult [“subject”]访问所有主题,到目前为止一切顺利
但是当我尝试访问个别主题时,例如jsonResult [“subject”] [0],Xcode给出了错误
不能下标“AnyObject”类型的值吗?索引类型为’Int’
有人可以帮我弄这个吗?

解决方法

当您下载字典时,如jsonResult [“subject”],您将获得一个可选项.你需要解开Optional.此外,因为这个字典是从JSON到达的,所以Swift不知道Optional包含什么类型的东西:它被输入为AnyObject – 这就是Swift将Optional描述为AnyObject的原因.所以你也告诉Swift这是什么类型的对象 – 它是一个字典数组,你需要告诉Swift,否则你将无法使用[0]下标它.

你可以一次完成这两件事,如下所示:

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

如果你非常非常确定你的地面,你可以强制展开和铸造,并将其减少到一行,如下所示:

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

但我无法推荐.有太多方法可以出错.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...