如何将字典加载到UIPickerView中

5

如何在Swift中从字典加载数据到PickerView中?

我有一个带有String键(州)和Double值(税金)的字典,我想做的是能够将键设置为UIPickerView的titleForRow并在选定key的情况下显示其值在textField中。

// Ideal Dictionary
private var states:[String:Double] = ["Alabama":6.000, "Illinois":7.000, "Oregon":8.000, "Wisconsin":9.000]

我可以使用两个数组来完成上述描述的操作,一个用于状态,一个用于税收,但我不认为从字典中加载不可能。
以下是我目前使用两个数组实现的代码。
// Arrays
private var stateName = ["Alabama", "Illinois", "Oregon", "Wisconsin"]
private var stateTax = ["6.000", "7.000", "8.000", "9.000"]

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return stateName.count
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    inputTaxRate.text = stateTax[row]
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return stateName[row]
}

有什么建议可以改进上述代码吗?

2个回答

22

字典是无序的,所以最好使用数组。您可以使用一个命名元组数组将数据保存在一个数组中:

let stateInfo:[(name: String, tax: Double)] = [("Alabama", 6.000), ("Illinois", 7.000), ("Oregon", 8.000), ("Wisconsin", 9.000)]

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return stateInfo.count
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    inputTaxRate.text = stateInfo[row].tax
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return stateInfo[row].name
}

非常感谢您的建议,我喜欢这种方法。 - fs_tigre
@vacawama 快速问题,我正在尝试将数组封装在一个类中,但我不确定如何返回元组的数组。`class Taxes{private let stateInfo: [(name: String, tax: Double)] = [ ("Alabama", 6.000), ("Illinois", 7.000), ("Oregon", 8.000), ("Wisconsin", 9.000) ] var tax:Array->(name:String, age:Int){ get{ return stateInfo } }}` 我该如何从类中返回数组? - fs_tigre
1
难道不应该是 var tax:[(name: String, tax: Double)] { get { return stateInfo } } 吗? - vacawama

1
你可以使用字典,但是字典没有顺序。你希望你的数据有序。如果顺序是字母顺序,你实际上会将你的字典变成现在拥有的两个数组。你不希望每次调用titleForRow时都重复这样做,所以你希望数组是永久的。因此,你的两个数组成为一个相当好的解决方案。你正在以无情的效率获取数据,这正是你想要的。

很酷,我想我不确定,因为这两个数组彼此没有关联,如果其中一个由于某种原因发生了变化,关系就会丢失,但我想这只是需要记住的事情,如果对其中一个进行更改,则需要对两个都进行更改。非常感谢。我是你书籍的忠实粉丝 :)。 - fs_tigre
1
谢谢。嗯,你可以保留一个状态-速率对的单个数组。这将解决更新问题。Vacawama在这方面是完全正确的。这些对可以是元组、数组甚至是自定义结构体。 - matt
非常感谢您的帮助。 - fs_tigre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接