“Dictionary”中包含的AnyObject类型的转换值

时间:2014-07-27 23:06:19

标签: casting swift

我有一个带有字符串键的字典,它包含不同类型的值。它是从plist文件加载的。我想将字典中的值分配给变量。出于某种原因,我需要两行来将值转换为具体类型。例如,此代码有效:

var stockItemData: [String: AnyObject]
var typeTemp: AnyObject? = stockItemData["type"]
var type = typeTemp as String

虽然这不起作用:

var stockItemData: [String: AnyObject]
var type = stockItemData["type"] as String

这里编译器给出了错误消息(String,AnyObject)不能转换为String。但显然它能够进行强制转换,因为上面的代码可以在两行代码中完成同样的工作。

有人可以向我解释,为什么会这样?还有更优雅的方法吗?

1 个答案:

答案 0 :(得分:3)

原因是因为String不符合AnyObject,但NSString符合。当你通过两个步骤完成它时,swift能够将未知的AnyObject转换为NSString,然后将其桥接到swift字符串。有几种方法可以解决这个问题。

最简单的方法是将字典设为[String : Any]。由于String符合Any,因此可以将Any转换为String。

var stockItemData: [String: Any] = ["type": "hello"]
var type = stockItemData["type"] as String

如果您无法更改字典的类型,您仍然可以在一行中执行两步操作,并且无需使用临时变量。

var stockItemData: [String: AnyObject] = ["type": "hello"]
var type = stockItemData["type"] as AnyObject? as String