web-dev-qa-db-ja.com

インデックスでNSDictionaryキーを取得しますか?

インデックスで辞書キーを取得することは可能ですか?

ピッカービューのデータソースに辞書を使用しようとしていますが、次のデリゲートメソッドでアクセスしたいと思います。

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0){
   return  [NSString stringWithFormat:@"%@",[myDict // how to get the key]];
}

編集-

myDictは次のようなものです。

アイテム1

  • サブアイテム1
  • サブアイテム2

アイテム2

  • サブアイテム1
  • サブアイテム2

MyDictを、2つのセクションを持つピッカービューのデータソースとして使用したいと思います。

セクション0 = myDictキー(アイテム1、アイテム2)

セクション1 =選択したセクション0行に対応するmyDict値(サブアイテム1、サブアイテム2)

10
Sam Luther

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->";
}
21
dasblinkenlight

これにより、ランダムに並べられたキーが得られます

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row    forComponent:(NSInteger)component{
    if (component == 0){
        return  [NSString stringWithFormat:@"%@",[myDict allKeys][row]];
    }
}
4
Hao

いいえ、辞書には順序がありません。

辞書に加えて、注文を与えるキーの配列を提供する必要があります。

@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
    }
    ...
1
trojanfoe

NSDictionaryは順序付けられていないデータ構造であるため、インデックスを使用してアクセスしてもあまり意味がありません。代わりにNSArrayが必要になる可能性があります。ただし、辞書でキーとしてNSNumbersを使用している場合は、次のようにアクセスします。

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if (component == 0) {
       return  [NSString stringWithFormat:@"%@", myDict[@(row)]];
    }
}
1
CrimsonChris