【问题标题】:Sort Dictionary Alphabetically Cannot assign value of type '[(key: String, value: AnyObject)]' to type 'Dictionary<String, AnyObject>?'按字母顺序排序字典
【发布时间】:2019-12-24 08:31:02
【问题描述】:

我有这本词典,我是从网络服务中获取的:

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! Dictionary<String, AnyObject>

现在我正在尝试按字母顺序对它们进行排序:

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

但我收到此错误:

无法将 '[(key: String, value: AnyObject)]' 类型的值分配给 输入“字典?”

我做错了什么?

这就是我定义 communityArray 的方式:

var communityArray: Dictionary<String, AnyObject>?

【问题讨论】:

  • 看起来您错误地将名为 communityArray 的变量声明为字典而不是数组。
  • 字典按定义是无序的,不能排序。你得到的是一个元组数组。这就是错误消息告诉您的内容。
  • ... Swift 3+ JSON 字典总是[String:Any],绝不是[String:AnyObject],如果预期类型是集合类型,.allowFragments 毫无意义。
  • 字典无法排序,

标签: swift


【解决方案1】:

正如 cmets 中提到的,字典(包含键值对的集合类型)根据定义是无序的,无法排序。

应用于字典的collectionsorted函数以字典为例

["foo" : 1, "bar" : false]

作为一个元组数组

[(key : "foo", value : 1), (key : "bar", value : false)]

并按键(.0) 或值(.1) 对它们进行排序(我怀疑按值Any 排序会引发编译器错误)

发生错误是因为您无法将 元组数组 分配给声明为 dictionary 的变量。这几乎是字面上的错误信息。

作为一种折衷方案,我建议将 map 字典转换为自定义结构(类似于元组但更好处理)

struct Community {
    let key : String
    let value : Any
}

你的变量名已经暗示你想要一个真实的数组

var communityArray = [Community]()

let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, Any>
communityArray = json.map { Community(key: $0.0, value: $0.1 }.sorted { $0.key < $1.key } 

【讨论】:

  • 不一定。如果结构仅在类的范围内使用,您甚至可以在类中声明结构。
  • communityArray 将在其他地方使用,它只是在一个文件中生成。
  • 然后你可以使用一个单独的文件,或者在填充communityArray的类之外的文件中声明它。
【解决方案2】:

sorted(by:)返回序列的元素,使用给定谓词排序作为元素之间的比较,所以不能用作字典。

有关此功能的更多信息,您可以阅读sorted(by:) documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多