AnyObject to Array?

时间:2014-09-29 10:42:01

标签: ios xcode swift type-conversion

我正在使用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;

5 个答案:

答案 0 :(得分:28)

将数据转换为数组:

var twDataArray = (twData as! NSArray) as Array

上面的代码首先将twData投射到NSArray,然后通过桥接投射投射到Array。桥接演员是一种特殊类型的演员,它将Objective-C类型转换为符合它的_ObjectiveCBridgeable符合Swift的类型。

(请注意,我不需要写Array<AnyObject>,因为AnyObjectNSArray的桥接演员推断了元素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>类型时,这将防止崩溃的应用程序。