[英]Swift 4 sort dictionary by the first value
我正在使用Swift 4开发iOS应用,并且有这样的字典:
var list = [
"US" : ["United-States","$"],
"FR" : ["France","€"],
"CN" :["China", "¥"]
]
我想根据每个字典的第一个值对基于此字典的UITableView
进行排序,以获得以下结果:
China
France
United-States
这可能吗?
您可以获取字典值(数组),映射它们的第一个元素并对其进行排序:
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
名称:中国
语法:¥
代号:FR
名称:法国
语法:€
代码:美国
名称:美国
语法:$
使用map
创建具有您国家的symbol
, name
和currency
的元组数组,然后按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”,名称:“ China”,货币:“¥”),(符号:“ FR”,名称:“ France”,货币:“€”),(符号:“ 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]
,因此需要有条件的强制转换。 此外,向上突破的创作newlist
和排序。
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”,名称:“ Canada”,货币:“ $”,注释:“ Whatever”,值:15),(符号:“ CN”,名称:“ China”,货币:“¥”,评论:“最终评论”,价值:5),(符号:“ FR”,名称:“法国”,货币:“€”,评论:“我的超级评论”,价值:20),(符号:“美国” ,名称:“美国”,货币:“ $”,评论:“我的评论”,值:10)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.