我正在使用NSJSONSerialization
:
let twData: AnyObject? = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)
这给了我一个AnyObject?
。
从这里开始,我想将其转换为Array<Dictionary<String,String>>
我已经尝试了各种各样的方法,直到这个:
var twDataArray: Array<Dictionary<String,String>>? = twData? as? Array<Dictionary<String,String>>
只是给出错误:
键入&#39;数组&gt;&#39;不符合协议 &#39; AnyObject&#39;
并提出更简单的版本:
var twDataArray = twData as Array
给出错误:
无法转换表达式&#39; AnyObject?&#39;输入&#39;数组&#39;
答案 0 :(得分:28)
将数据转换为数组:
var twDataArray = (twData as! NSArray) as Array
上面的代码首先将twData
投射到NSArray
,然后通过桥接投射投射到Array
。桥接演员是一种特殊类型的演员,它将Objective-C类型转换为符合它的_ObjectiveCBridgeable
符合Swift的类型。
(请注意,我不需要写Array<AnyObject>
,因为AnyObject
→NSArray
的桥接演员推断了元素Array
请注意,上面的广告强制向下广播。如果您绝对确定twData
将成为NSArray
的实例,请仅使用此选项。否则,请使用可选的强制转换。
var twDataArray = (twData as? NSArray) as Array?
答案 1 :(得分:2)
尝试以下操作,您可以按照下面的说明遍历数组。
for element in twData as! Array<AnyObject> {
print(element)
}
答案 2 :(得分:1)
这适用于游乐场:
var data: Array<Dictionary<String,String>>? = twData as? Array<Dictionary<String, String>>
与您的代码的不同之处在于twData
最后不需要?
- 它是可选的,因此as?
运算符将负责验证它是否可以是大小写一系列词典 - 不用说,如果它没有,as?
将评估为零
答案 3 :(得分:0)
let twData: Any = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)
请勿使用AnyObject
。使用Any
代替AnyObject
。它将正常工作。 AnyObject
适用于所有引用类型,而Array是值类型。这就是为什么这样。将其更改为Any
。
答案 4 :(得分:-1)
如您所知,它是一种String类型,您可以插入可转换的内容,请执行以下操作:
if let twoDataArray = twData as? Array<Dictionary<String, String>>{
for data in twoDataArray{
print(data)
}
}
当字典不是<String,String>
类型时,这将防止崩溃的应用程序。