初始化NSMutableDictionary

时间:2011-07-12 21:15:56

标签: iphone nsdictionary nsmutabledictionary

我正在尝试创建一个过滤器。我有一个函数返回NSArray我可以拥有的不同类别。我想为“全部”添加一个额外选项,表示没有应用过滤器。例如,应显示:

All
Soda
Wine
Beer

我从这开始,但我认为这根本不是很好的实现,而且也不正确。这就是我到目前为止所处的位置:

- (void)initCategoryDictionary {
    NSMutableArray *conditionCategories = (NSMutableArray *)[self GetAllCategories]; 
    [conditionCategories insertObject:@"All" atIndex:0];    // no filter case at first index
    NSMutableArray *objectValues = [NSMutableArray array];
    [objectValues addObject:[NSNumber numberWithBool:YES]]; // this is for the no filter case at the first index
    for (int i = 0; i < [conditionCategories count]; i++) {
        [objectValues addObject:[NSNumber numberWithBool:NO]];
    }
    self.CategoryDictionary = [NSMutableDictionary dictionaryWithObjects:objectValues forKeys:conditionCategories]; 
}

在方法的第一行,我不知道是否应该对此进行类型转换。我的类别目前没有“全部”类别,所以这是我可以想到在将NSArray插入字典之前将其添加到NSArray的方式。

我想我可以添加一个YES,NO,NO,......数组(对于字典中的所有其他项都是NO)。这样,我的字典将默认为All为true(未应用过滤器)。然后根据选择的内容,我将All改为NO,其他值选择为YES并适当过滤。 (for循环是错误的,因为它只给了我一个包含0和1作为我的值的2个对象的数组。

所以这就是我认为我会做的,但显然这不是一个好的或正确的做事方式。有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:0)

如果要应用All,为什么不将它作为单独的布尔值,将其作为过滤器的一部分进行检查,并且不要担心它在数组本身中?

答案 1 :(得分:0)

您可以做的一件事是将类别名称映射到NSPredicate的实例。每个谓词本身都会执行过滤器(虽然我不清楚被过滤的是什么)。因此,您可以按如下方式设置字典:

- (void)initCategoryDictionary {
    NSMutableArray *conditionCategories = (NSMutableArray *)[self GetAllCategories]; 
    [conditionCategories insertObject:@"All" atIndex:0];    // no filter case at first index
    NSMutableArray *objectValues = [NSMutableArray array];
    [objectValues addObject:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]; // this is for the no filter case at the first index
    for (NSString *category in conditionCategories) {
        [objectValues addObject:[NSPredicate predicateWithFormat:@"category == %@", category]];
    }
    self.CategoryDictionary = [NSMutableDictionary dictionaryWithObjects:objectValues forKeys:conditionCategories]; 
}

TRUEPREDICATE将始终返回true,因此匹配任何内容。您必须编辑其他谓词以处理您正在过滤的任何内容。

答案 2 :(得分:0)

你真的很难做到这一点。您尝试为字典初始化设置一个数组和值,这是可能的,但对于您正在做的事情来说真的很难。我只想创建一个NSMutableDictionary,添加键的值。

-(void) initCategoryDictionary {
     NSMutableDictionary *dict = [[[NSMutableDictionary alloc] initWithValue:[NSNumber numberWithBool:YES]] autorelease];

     NSArray *conditionCategories = [self GetAllCategories]; //No you dont need to type cast this as long as it returns the same type (NSArray here)

     for(NSString *str in conditionCategories) {
          [dict addValue:[NSNumber numberWithBool:NO] forKey:str];
     }

     [self setCategoryDictionary:dict];
}