是否可以通过索引获取字典键?
我试图使用字典作为选择器视图的数据源,并希望通过以下委托方法访问它:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0){
return [NSString stringWithFormat:@"%@",[myDict // how to get the key]];
}
编辑 -
myDict类似于:
第1项
第2项
我想使用myDict作为包含2个部分的选择器视图的数据源:
第0节= myDict键(第1项,第2项)
第1部分=所选第0行(子项目1,子项目2)的相应myDict值
答案 0 :(得分:21)
由于NSDictionary
是无序关联容器,因此它没有索引的概念。它的密钥是任意排序的,并且该顺序将来可能会改变。
您可以从字典中获取NSArray
个密钥,并对其应用索引:
NSArray *keys = [myDict allKeys]; // Warning: this order may change.
但是,只要字典保持不变,此索引方案就会保持一致:例如,如果使用NSMutableDictionary
,则添加额外的键可能会更改现有键的顺序。这导致了极难调试的问题。
更好的方法是将拣货员的物品放入有序的容器中,例如NSArray
。为选择器项创建一个特殊类,例如
@interface MyPickerItem : NSObject
@property (readwrite, nonatomic) NSString *item1;
@property (readwrite, nonatomic) NSString *item2;
@end
从您的词典中创建NSArray
个此类MyPickerItem
个对象,按照您希望它们在选择器视图中显示的方式排序(例如,按item1
按字母顺序排列,然后按{{ 1}})并使用item2
作为选择器视图的数据源:
NSArray
答案 1 :(得分:4)
这将为您提供随机排序的密钥
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0){
return [NSString stringWithFormat:@"%@",[myDict allKeys][row]];
}
}
答案 2 :(得分:1)
不,因为字典没有订单。
除了字典之外,您还需要提供一系列密钥,这些密钥会为您提供订单。
@interface MyClass ()
@property NSMutableArray *keysArray; // Don't forget to allocate this in an init method
@end
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
{
if (component == 0){
NSString *key = self.keysArray[row];
return self.myDict[key]; // I assume you just want to return the value
}
...
答案 3 :(得分:1)
NSDictionary
是一种无序的数据结构,这意味着使用索引进行访问没有多大意义。您可能需要NSArray
。但是,如果您的词典使用NSNumbers
作为键,那么您可以像这样访问它。
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0) {
return [NSString stringWithFormat:@"%@", myDict[@(row)]];
}
}