Sorting/Accessing 嵌套在字典中的数组

Sorting/Accessing Arrays nested in Dictionaries

我已经看到如何对嵌套在字典中的字典进行排序,但我似乎无法对嵌套在字典中的数组进行排序。

这是我要排序的示例。

var dictionary = [3: ["name1", 30, "birthmonth1", 30.50293], 1: ["name2", 35, "birthmonth2", 25.17633], 10: ["name3", 25, "birthmonth3", 32.49927]]

我在Swift 5中尝试过各种排序。但是,我更熟悉python和javascript。

例如:

var sortBySecondElement = dictionary.sorted(by: {0[1].value < [1].value})

如何让排序功能发挥作用?

快速而简单的解决方案是:

let sortedKVPs = dictionary.sorted(by: { ([=10=].value[1] as! Int) < (.value[1] as! Int) })

注意是[=13=].value[1][=14=] 是键值对,[=15=].value 是数组,[=13=].value[1] 是该数组的第二个元素。您还需要保证 Swift 数组的第二个元素确实是带有强制转换的 Int (as! Int).

您的数组同时包含 StringInt,因此它的类型被推断为 [Any]。编译器无法知道该数组中每个元素的类型,因为您可以在其中放入任何字面意思的内容。 [=13=].value[1].value[1] 可能属于不同的、不可比较的类型,这就是为什么您不能使用 < 直接比较它们的原因。

另外需要注意的是,排序后的结果不是字典。它是一个键值对数组,因为字典没有排序,只有数组才排序。


虽然上述解决方案可行,但它非常脆弱。由于每个数组代表一个人,因此您应该创建一个 Person 结构来代表一个人,而不是一个数组:

struct Person {
    let name: String
    let age: Int
    let birthMonth: Int
    let someOtherProperty: Double // I don't know what the fourth element in the array means
}

let dictionary = [
    3: Person(name: "name1", age: 30, birthMonth: 1, someOtherProperty: 30.50293),
    ...
]

现在排序变得很容易了:

let sortedKVPs = dictionary.sorted { [=12=].age < .age }