NSDictionary 枚举二级

NSDictionary enumerate second level

考虑以下 NSDictionary:

展开后如下所示:

我想为每个 "features" 键创建一个 NSObject,"geometry" 和 "type" 作为 属性,但我无法得到我的绕过

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

方法。有没有办法通过键名来表示入口级别?

我确实四处搜索了很多,但 none 我发现的东西似乎是合适的。希望大家多多耐心。

以下是我创建要素对象的方式:

@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];
        }
    }
}];

希望这对您有所帮助。

如果您知道存储的密钥,您可以这样做:

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];
}