Saya ingin mengubah semua nilai Kamus menjadi String, bagaimana melakukannya?

Seperti:

{   @"a":"a", 
    @"b":2, 
    @"c":{
      @"c1":3,
      @"c2":4
    }
}

Saya ingin mengkonversi ke:

{   @"a":"a", 
    @"b":"2", 
    @"c":{
      @"c1":"3",
      @"c2":"4"
    }
}

Bagaimana melakukannya? Saya pikir sepanjang hari.

Jika saya menggunakan metode di bawah ini untuk melintasi nilai kamus:

NSArray *valueList = [dictionary allValues];

for (NSString * value in valueList) {
    // change the value to String
}

Jika nilainya kamus, bagaimana?

Jadi, seseorang dapat membantu dengan itu?

1
qg_java_17137 16 Maret 2017, 17:19

2 jawaban

Jawaban Terbaik

Anda bisa melakukan ini dengan metode rekursif, ini mengubah semua nilai NSNumber menjadi NSString dan memanggil dirinya sendiri untuk kamus bersarang. Karena kamus tidak dapat dimutasi saat sedang dihitung, kamus baru dibuat dan diisi:

- (void)changeValuesOf:(NSDictionary *)dictionary result:(NSMutableDictionary *)result
{
    for (NSString *key in dictionary) {
        id value = dictionary[key];
        if ([value isKindOfClass: [NSDictionary class]]) {
            NSMutableDictionary * subDict = [NSMutableDictionary dictionary];
            result[key] = subDict;
            [self changeValuesOf:value result:subDict];
        } else if ([value isKindOfClass: [NSNumber class]]) {
            result[key] = [NSString stringWithFormat:@"%@", value];
        } else {
            result[key] = value;
        }
    }
}

NSDictionary *dictionary = @{@"a": @"a", @ "b":@2, @"c": @{@"c1": @3,  @"c2":@4 }};
NSMutableDictionary *result = [NSMutableDictionary dictionary];
[self changeValuesOf:dictionary result:result];
NSLog(@"%@", result);
0
vadian 16 Maret 2017, 14:54

Anda dapat membuat kategori untuk kamus dan menambahkan metode seperti stringValueForKey:. Realisasinya bisa seperti ini:

- (NSString)stringValueForKey:(NSString*)key
{
   id value = self[key];
   if( [value respondsToSelector:@selector(stringValue)])
       return [value performSelector:@selector(stringValue)]
   return nil;
}
0
Sergey 16 Maret 2017, 14:33