任意对象转为数组?

32

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

只是简单地给出了错误:

类型 'Array>' 不符合协议 'AnyObject'。

将更简单的版本放进去:

var twDataArray = twData as Array

出现错误:

无法将表达式的类型“AnyObject?”转换为类型“Array”


5个回答

31
将您的数据转换为数组:

要将您的数据转换为数组:

var twDataArray = (twData as! NSArray) as Array

上述代码首先将twData转换为一个NSArray,然后通过桥接转换将其转换为Array。桥接转换是一种特殊类型的转换,它将Objective-C类型转换为其符合_ObjectiveCBridgeable协议的Swift对应类型。

(请注意,我不需要编写Array<AnyObject>,因为在桥接转换中,元素AnyObject是从NSArrayArray中推断出来的)

请注意,上述转换是一个强制向下转换。仅在您绝对确定twData将是NSArray实例时才使用此选项。否则,请使用可选转换。

var twDataArray = (twData as? NSArray) as Array?

我该如何将它强制转换为特定类型,比如[UInt8]? - H Raval

2

尝试以下方法,您可以按照下面的方式遍历数组。

for element in twData as! Array<AnyObject> {
    print(element)
}

1

这在游乐场中可以运行:

var data: Array<Dictionary<String,String>>? = twData as? Array<Dictionary<String, String>>

与您的代码不同之处在于,twData 不需要在末尾添加 ? - 它是一个可选项,因此 as? 运算符会负责验证它是否可以转换为字典数组 - 不用说,如果它是 nil,as? 将评估为 nil。

0
let twData: Any = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)

不要使用 AnyObject。请改用 Any 代替 AnyObject。这样就可以正常工作了。AnyObject 是针对所有引用类型的,而数组是值类型。这就是为什么会出现这种情况。将其更改为 Any


-1

正如您已经知道的那样,您正在插入一个可转换的字符串类型,请执行以下操作:

if let twoDataArray = twData as? Array<Dictionary<String, String>>{
   for data in twoDataArray{
       print(data)
   }
}

当字典不是<String,String>类型时,这将保护您免受应用程序崩溃的影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接