2015-09-11 2 views
2

Рассмотрим следующий NSDictionary: enter image description hereNSDictionary перечисления второго уровня

При разворачивании это выглядит следующим образом: enter image description here

Я хотел бы создать NSObject каждого из «особенностей» клавиш, с «геометрией «и« тип »как свойство, но я не могу опустить голову вокруг

[myDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ 

подход. Нет ли способа указать входной уровень, указав ключевое имя?

Я ДЕЙСТВИТЕЛЬНО много искал, но ни один из материалов, которые я нашел, кажется уместным. Надеюсь, у вас есть некоторое терпение.

ответ

1

Вот как я хотел бы создать объекты функций:

@interface Feature : NSObject 
@property (nonatomic, strong) NSString *geometry; //case is important 
@property (nonatomic, strong) NSString *type; //case is important 
@end 

Тогда я хотел бы использовать KVC для его создания. Поэтому мне нужно реализовать метод setValue:forUndefinedKey, чтобы избежать аварии:

@implementation Feature 

- (void) setValue:(id)value forUndefinedKey:(NSString *)key{ 
    NSLog(@"key %@ does not exist", key); 
} 

@end 

Тогда я предполагаю, что вы хотите массив объекта особенность:

NSMutableArray *featureArray = [[NSMutableArray alloc] init]; 

И, чтобы заполнить этот массив:

NSMutableArray *featureArray = [[NSMutableArray alloc] init]; 
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { 
    NSLog(@"key: %@", key); 
    if ([obj isKindOfClass:[NSArray class]]) 
    { 
     NSArray *arr = (NSArray *)obj; 
     for (NSDictionary *childDic in arr) { 
      Feature *f = [[Feature alloc] init]; 
      [childDic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull childKey, id _Nonnull childObj, BOOL * _Nonnull childStop) { 
       [f setValue:childObj forKey:childKey]; 
      }]; 
      [featureArray addObject:f]; 
     } 
    } 
}]; 

Надеюсь это поможет.

+0

Так или иначе, все свойства F являются NIL. Не следует ли сначала установить значения f, а THEN - добавить их в массив? – Sjakelien

+0

Да, вы можете добавить объект объекта после установки значения. Я обновил свой ответ –

+0

Это делает трюк! Спасибо огромное! – Sjakelien

0

Если вы знаете, ключи, которые хранятся, вы можете сделать это:

NSMutableArray * pmaMyObjs= [NSMutableArray array]; 
NSArray* paFeatures= [myDict objectForKey:@"features"]; 
for(int i= 0; i < paFeatures.count; ++i) 
{ 
    NSDictionary * pdItem= [paFeatures objectAtIndex:i]; 
    MyObj* pMyObj= [MyObj alloc] initWithGeo:[pdItem objectForKey:@"geometry"] properties:[pdItem objectForKey:@"properties"]; 
    [pmaMyObjs addObject:pMyObj]; 
} 
+0

Я не уверен, что это "initWithGeo:" означает – Sjakelien

+0

О, мой плохой. Вы сказали, что хотите создавать объекты из данных, MyObj был всего лишь примером подкласса NSObject с initWithGeo, являющимся первой меткой параметра, чтобы вы могли перейти в поле геометрии. – mark

Смежные вопросы