【问题标题】:Swift 4 Dictionary [String : AnyObject] sort by key in alphabetical orderSwift 4 Dictionary [String : AnyObject] 按字母顺序按键排序
【发布时间】:2018-06-13 14:56:32
【问题描述】:

我有一个定义为 [String: AnyObject] 的字典,如下所示:

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject]

现在我正在尝试将它们按键按字母顺序排列。我尝试了以下方法:

self.appDelegate.communityArray = json.sorted(by: { $0.0 < $1.0 })

但我收到此错误:

无法将 '[(key: String, value: AnyObject)]' 类型的值分配给 键入'[String : AnyObject]?'

我做错了什么?

我的变量 json 是:

({"BBB" : Array("aaa", "bbb", "ccc")}, {"AAA" : Array("aaa", "bbb", "ccc")})

我想要得到的是:

({"AAA" : Array("aaa", "bbb", "ccc")}, {"BBB" : Array("aaa", "bbb", "ccc")})

【问题讨论】:

  • 字典根据定义是无序的。排序函数的结果是一个元组数组。

标签: ios swift


【解决方案1】:

我认为第一步是改变

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject]

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : Any]

但我不明白您为什么要对字典进行排序。也许您打算将变量 json 声明为数组?

【讨论】:

    【解决方案2】:

    您的communityArray 类型错误。如错误说明,您需要的类型是[(key: String, value: AnyObject)](元组数组)。

    【讨论】:

      【解决方案3】:

      由于您没有提供实际的 JSON,我不得不猜测一下。但正如其他人告诉你的那样,你不应该依赖Dictionary 中的键顺序。您始终可以对键进行排序并相应地访问您的Dictionary。由于sorted 将返回Array,因此下面的 Playground 应该会显示效果:

      import Cocoa
      
      let jsonData = """
          {"BBB" : ["aaa", "bbb", "ccc"], "AAA" : ["aaa", "bbb", "ccc"]}
      """.data(using: .utf8)!
      
      do {
          let dict = try JSONSerialization.jsonObject(with: jsonData, options:.allowFragments) as! [String : Any]
          print(dict)
          let array = dict.sorted(by: {$0.0 < $1.0})
          print(array)
          print(type(of:array))
      } catch {
          print(error)
      }
      

      我建议你修改你的结构定义,以使一些行像

      let dict = try JSONDecoder().decode([String:Any].self, from:jsonData)
      

      在您的 do 中工作。由于Any 无法实现Codable,因此该行将不起作用,因此应将其替换为“真实的东西”。当前版本将为您提供 NSArray 对象作为您的 dict 中的值,这很难使用。您的代码将从正确的定义中受益匪浅(如果可能的话)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        相关资源
        最近更新 更多