【问题标题】:Contextual type 'AnyObject' cannot be used with dictionary literal - data structure not consistent上下文类型“AnyObject”不能与字典文字一起使用 - 数据结构不一致
【发布时间】:2017-01-06 06:21:45
【问题描述】:

我正在尝试在 swift 中设置一个简单的字典:

var dict = [
  "_id": "123",
  "profile": [
    "name": "me",
    "username": nil,
  ]
] as [String : Any]

但是,Contextual type 'AnyObject' cannot be used with dictionary literal 失败了。在this question 之后,我尝试将[String : Any] 替换为[String : [String : Any]],但这在逻辑上失败了,因为第一个值的类型是String 而不是[String : Any]

我只想拥有可以保存任何类型数据的东西,我可以将其表示为 json,并且我可以在以后尝试访问它们时必须保护它们。

【问题讨论】:

    标签: json swift dictionary


    【解决方案1】:

    Swift 是一种严格类型的语言,所以问题是当你将nil 添加到字典时,它无法知道它的 values 将是什么类型,所以它'会抱怨说类型不明确。

    您可以通过执行以下操作来指定字典的键和值的类型:

    let profile: [String: AnyObject?] = ["name": "me", "username": nil]    
    let dict = ["_id": "123", "profile": profile] as [String : Any]
    

    或者,您可以使用init(dictionaryLiteral:) 构造函数来创建字典:

    let dict = [
      "_id": "123",
      "profile": Dictionary<String, AnyObject?>(dictionaryLiteral: ("name", "me"), ("username", nil))
    ] as [String : Any]
    

    【讨论】:

    • 我明白了。事情变得如此混乱仍然很奇怪。无论如何,如果我按照你的回答,我就会得到JSONSerialization.isValidJSONObject(dict) 成为false。知道发生了什么吗? Json 没有任何接近严格类型的问题,所以我认为这很好。
    • @Guig 这是一个不同的问题,与您上面遇到的问题无关。您能否将其作为关于 SO 的单独问题提出?
    • 我认为问题不在于 Guig 试图将 nil 添加到字典中,而是新的 Swift 编译器不允许使用文字字典 AnyObject
    【解决方案2】:

    另外,拆分也可以:

    let insideDict = [
        "name": "me",
        "username": nil,
      ]
    
    var dict = [String : Any]()
    dict["_id"] = "123"
    dict["profile"] = insideDict
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多