インデックスで辞書キーを取得することは可能ですか?
ピッカービューのデータソースに辞書を使用しようとしていますが、次のデリゲートメソッドでアクセスしたいと思います。
- (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行に対応するmyDict値(サブアイテム1、サブアイテム2)
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
、次にitem2
)、ピッカービューのデータソースとしてNSArray
を使用します。
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
MyPickerItem *p = myArray[row];
switch (component) {
case 0: return p.item1;
case 1: return p.item2;
}
return @"<-ERROR->";
}
これにより、ランダムに並べられたキーが得られます
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0){
return [NSString stringWithFormat:@"%@",[myDict allKeys][row]];
}
}
いいえ、辞書には順序がありません。
辞書に加えて、注文を与えるキーの配列を提供する必要があります。
@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
}
...
NSDictionary
は順序付けられていないデータ構造であるため、インデックスを使用してアクセスしてもあまり意味がありません。代わりにNSArray
が必要になる可能性があります。ただし、辞書でキーとしてNSNumbers
を使用している場合は、次のようにアクセスします。
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0) {
return [NSString stringWithFormat:@"%@", myDict[@(row)]];
}
}