簡體   English   中英

Swift 4按第一個值排序字典

[英]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創建具有您國家的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”,名稱:“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM