Swift 4排序字典的第一个值

我正在使用Swift 4开发iOS应用程序,我有一个这样的字典:

var list = [ "US" : ["United-States","$"], "FR" : ["France","€"], "CN" :["China", "¥"] ] 

我想基于这个字典对每个键的第一个值排序一个UITableView ,以获得以下结果:

 China France United-States 

这有可能吗?

使用map创建一个元组数组,其中包含您所在国家/地区的symbolnamecurrency ,然后按name对该数组进行排序:

 let list = ["US" : ["United-States","$"], "FR" : ["France","€"], "CN" : ["China", "¥"]] let newlist = list.map { (symbol: $0.key, name: $0.value.first ?? "", currency: $0.value.dropFirst().first ?? "")}.sorted { $0.name < $1.name } print(newlist) 

[(符号:“CN”,名称:“中国”,货币:“¥”),(符号:“FR”,名称:“法国”,货币:“€”),(符号:“US”,名称: “美国”,货币:“$”)]

这将允许您轻松访问您的表格的所有信息:

 let symbol = newlist[indexPath.row].symbol let name = newlist[indexPath.row].name let currency = newlist[indexPath.row].currency 

要不就:

 let (symbol, name, currency) = newlist[indexPath.row] 

对于你更复杂的字典......

你的一个问题是你的value现在是[Any] ,所以需要条件转换。 另外,分解新列表的创建和排序。

 let list = ["US" : ["United-States","$","My comment", 10], "FR" : ["France","€", "My super comment", 20], "CA" : ["Canada","$", "Whatever", 15], "CN" : ["China", "¥", "Final comment", 5]] let newlist = list.map { (symbol: $0.key, name: $0.value.first as? String ?? "", currency: $0.value.dropFirst().first as? String ?? "", comment: $0.value.dropFirst(2).first as? String ?? "", value: $0.value.dropFirst(3).first as? Int ?? 0) } let sortedlist = newlist.sorted { $0.name < $1.name } print(sortedlist) 

[(符号:“CA”,名称:“加拿大”,货币:“$”,评论:“随便”,价值:15),(符号:“CN”,名称:“中国”,货币:“¥”,评论:“最终评论”,价值:5),(符号:“FR”,名称:“法国”,货币:“€”,评论:“我的超级评论”,价值:20),(符号:“美国” ,名称:“美国”,货币:“$”,评论:“我的评论”,价值:10)]

您可以获取字典值(数组),映射它们的第一个元素并对其进行排序:

 let list = ["US" : ["United-States","$"], "FR" : ["France","€"], "CN" : ["China", "¥"]] let countries = list.values.compactMap{$0.first}.sorted() print(countries) // ["China", "France", "United-States"] 

另一个选择是为您的货币创建一个结构,创建一个自定义初始值设定项,它接受一个键值对并使其符合Comparable协议:

 struct Currency: CustomStringConvertible, Comparable { let name: String let code: String let symbol: String init?(currency: (key: String, value: [String])) { guard currency.value.count == 2 else { return nil } self.code = currency.key self.name = currency.value.first! self.symbol = currency.value.last! } var description: String { return "Code: \(code)\nName: \(name)\nSynmbol: \(symbol)\n" } } extension Currency { static func <(lhs: Currency, rhs: Currency) -> Bool { return lhs.name < rhs.name } } 

 let list = ["US" : ["United-States","$"], "FR" : ["France","€"], "CN" :["China", "¥"]] let currencies = list.compactMap(Currency.init).sorted() currencies.map({print($0)}) 

这将打印:

代码:CN

名称:中国

Synmbol:¥

代码:FR

姓名:法国

Synmbol:€

代码:美国

姓名:美国

Synmbol:$