Swift 4排序字典的第一个值
我正在使用Swift 4开发iOS应用程序,我有一个这样的字典:
var list = [ "US" : ["United-States","$"], "FR" : ["France","€"], "CN" :["China", "¥"] ]
我想基于这个字典对每个键的第一个值排序一个UITableView
,以获得以下结果:
China France United-States
这有可能吗?
使用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”,名称:“中国”,货币:“¥”),(符号:“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:$