Swift 按特定顺序用数组填充UIPickerView

Swift 按特定顺序用数组填充UIPickerView,swift,sorting,uipickerview,Swift,Sorting,Uipickerview,我在Translator类中有一个语言及其代码的散列[String:String] let language_codes: [String: String] = [ NSLocalizedString("English", comment: "English") : "1" , NSLocalizedString("German", comment: "German") : "7" , NSLocalizedString("French", comme

我在
Translator
类中有一个语言及其代码的散列
[String:String]

let language_codes: [String: String] = [
    NSLocalizedString("English", comment: "English")     : "1" ,
    NSLocalizedString("German", comment: "German")       : "7" ,
    NSLocalizedString("French", comment: "French")       : "3" ,
    NSLocalizedString("Spanish", comment: "Spanish")     : "12",
    NSLocalizedString("Italian", comment: "Italian")     : "5"
]
我需要以相同的顺序用哈希键填充
UIPickerView
,因为它们在哈希中是:英语、德语、法语等

此函数按不同的顺序返回它们:法语、英语、德语、意大利语、西班牙语

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return Array(translator.language_codes.keys)[row]
}

我不明白为什么。谢谢你的帮助

Swift字典天生就是无序的。考虑以下选项之一:

元组数组 使用元组存储语言和代码,然后创建元组数组:

private typealias LanguageCode = (localizedString: NSLocalizedString, code: String)

let language_codes: [LanguageCode] = [
(localizedString: NSLocalizedString("English", comment: "English"), code: "1")
...
]
然后,在pickerView函数中:

return translator.language_codes[row].localizedString
return translator.language_codes[row].localizedString
自定义对象数组 或者,创建一个自定义对象,而不是使用元组,这可能会变得混乱。在这种情况下,结构(值类型)可能是最好的:

struct LanguageCode {
    let localizedString: NSLocalizedString
    let code: String
}

let language_codes: [LanguageCode] = [
LanguageCode(localizedString: NSLocalizedString("English", comment: "English"), code: "1")
...
]
然后,在pickerView函数中:

return translator.language_codes[row].localizedString
return translator.language_codes[row].localizedString

编辑:在声明类型时,您可能希望使用
字符串
而不是
NSLocalizedString

语言代码是一个无序集合的字典。translator.language_code.keys不会返回与初始字典中相同的顺序。