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

时间:2016-02-21 22:21:44

标签: swift sorting uipickerview

我在[String: String]类中有一堆语言及其代码Translator

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]
}

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

1 个答案:

答案 0 :(得分:3)

Swift Dictionaries本质上是无序的。请考虑以下选项之一:

元组数组

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

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

自定义对象数组

或者,创建一个自定义对象而不是使用可能变得混乱的元组。在这种情况下,struct(值类型)可能是最好的:

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

修改:在声明类型时,您可能希望使用String而不是NSLocalizedString