【问题标题】:AnyObject (from JSONObjectWithData) is not convertible to [String : Any]AnyObject(来自 JSONObjectWithData)不能转换为 [String : Any]
【发布时间】:2014-10-10 13:34:16
【问题描述】:

我从使用 [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] ,并且看不到任何不应该的充分理由,以及一个好的解决方案。

【问题讨论】:

  • 注意String不是一个对象,它是一个结构体。

标签: json dictionary swift


【解决方案1】:

在 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

【讨论】:

  • 我认为它会起作用,但对于[String: AnyObject]。正如我所说,我正在寻找一种使用[String: Any] 的方法,因为如果我使用[String: AnyObject],我最终会在我的代码的其他部分中得到无法转换为Swift 类型的值,这是唯一的解决方案放弃 Swift 类型并将其转换为 NSStringNSNumberNSBoolean 等。我试图尽可能多地使用 Swift,但这似乎并不容易。本次讨论的较早部分是here
  • 我很抱歉 - 我很快就驳回了您的回答。尽管它没有为我提供使用 Any 的解决方案,但它确实为上一个问题中的 AnyObject 问题提供了解决方案,以您最后正在执行的双重转换的形式。如果我没看错,关键是主 json 对象是隐式 unwrapped ,但其中的元素不是,这意味着我之前试图将 Optional 强制转换为 String。这里所需的语法似乎有点笨拙,但确实有效,所以谢谢!
  • 这解决了我的问题,但语法似乎很奇怪。
  • @Mundi 如果我不知道键:“age”映射值的类型,值可能是Int,可能是String,也可能是其他类型,我怎样才能得到@987654333 @?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2018-04-18
  • 2017-04-14
  • 2015-11-04
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多