【问题标题】:Swift 4 sort dictionary by the first valueSwift 4 按第一个值排序字典
【发布时间】:2019-01-23 22:50:29
【问题描述】:

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

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

我想根据这个字典按每个键的第一个值对UITableView 进行排序,以获得以下结果:

China
France
United-States

这可能吗?

【问题讨论】:

  • 字典没有顺序。你最好围绕你的数据模型定义一个结构

标签: ios arrays swift sorting dictionary


【解决方案1】:

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

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

名称:法国

符号:€

代码:美国

名称:美国

符号:$

【讨论】:

  • 您可能希望按第一个值对键进行排序,以便 OP 可以轻松访问国家/地区缩写和货币符号,或者以某种方式将这些元素组合到数组中。
  • 我知道我们可以做到,但似乎他只是对国家列表感兴趣。如果 OP 也需要这些值,我会制作一个自定义结构。
  • 谢谢!但我在 xcode 中有一个问题:在调用中缺少参数“by”的参数。此外,我不仅对国家列表感兴趣,我的目标是在将数据打印到 UITableView 之前重新组织我的字典。因为目前,该列表是在应用程序中随机打印的..
  • 谢谢Leo,我也要试试!
【解决方案2】:

使用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],所以需要条件转换。另外,分解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”,名称:“加拿大”,货币:“$”,注释:“随便”,值:15),(符号:“CN”,名称:“中国”,货币:“ ¥”,comment:“最终评论”,价值:5),(符号:“FR”,名称:“法国”,货币:“€”,评论:“我的超级评论”,价值:20),(符号: “US”,名称:“United-States”,货币:“$”,评论:“我的评论”,值:10)]

【讨论】:

  • 刚刚用几个cmets回答了你
  • 坦克!我现在明白了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2020-12-04
  • 2016-11-22
  • 2021-06-30
相关资源
最近更新 更多