我从使用[String:AnyObject]字典转向使用[String:Any],希望能够利用字典值中的原生Swift值类型(例如String)而不是旧的基础值(例如NSString)。这似乎几乎无处不在,但是我想要实现的是这一行代码:
let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil)
在Swift中,这将返回一个AnyObject!
,当我使用println在控制台中显示它时,它看起来与预期完全一样,并且调试区域中的长签名表明NSDictionary是它的基础,但是当我尝试强制转换时如果在上面一行的末尾有as [String : Any]
,我会收到以下错误:
AnyObject is not convertible to [String : Any]
为什么会发生这种情况,如何解决这个问题,请记住我确实想在这里使用[String:Any],并且看不出任何不可能的好理由,这是一个很好的解决方案。
答案 0 :(得分:3)
在Playground中试验了一下后,下面的代码似乎有效。请注意,Any
不起作用,而AnyObject
似乎按预期工作。
let jsonString = "{\"name\":\"John\", \"age\":23}"
let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
let json = NSJSONSerialization.JSONObjectWithData(jsonData,
options: NSJSONReadingOptions.MutableContainers, error: nil) as [String:AnyObject]
// ["name": "John", "age": __NSCFNumber]
let name = json["name"] as AnyObject! as String // "John"
let age = json["age"] as AnyObject! as Int // 23