按字母顺序排序字典无法指定类型'[(key:String,value:AnyObject)]'的值以键入'Dictionary <String,AnyObject>?'

use*_*331 7 swift

我有这个字典,我从一个Web服务获得:

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

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

self.appDelegate.communityArray = json.sorted(by: {$0.0 < $1.0})
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

无法指定类型'[(key:String,value:AnyObject)]'的值来键入'Dictionary?'

我究竟做错了什么?

这就是我定义communityArray的方式:

var communityArray: Dictionary<String, AnyObject>?
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 1

正如评论中提到的,字典 \xe2\x80\x93 包含键值对 \xe2\x80\x93 的集合类型根据定义是无序的,无法排序。

\n\n

sorted应用于字典的函数以collection字典为例

\n\n
["foo" : 1, "bar" : false]\n
Run Code Online (Sandbox Code Playgroud)\n\n

作为元组数组

\n\n
[(key : "foo", value : 1), (key : "bar", value : false)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

作为妥协,我建议map字典使用自定义结构(类似于元组,但更好处理)

\n\n
struct Community {\n    let key : String\n    let value : Any\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您的变量名称已经暗示您想要一个真正的数组

\n\n
var communityArray = [Community]()\n\nlet json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, Any>\ncommunityArray = json.map { Community(key: $0.0, value: $0.1 }.sorted { $0.key < $1.key } \n
Run Code Online (Sandbox Code Playgroud)\n