Objective C. NSMutable Dictionary为现有密钥添加值

时间:2016-11-30 11:43:23

标签: objective-c nsmutablearray nsmutabledictionary

有没有办法为NSMutableDictionary上的现有密钥添加值?

以下是我的代码片段

 NSMutableArray *mainFeedList = [NSMutableArray array];
  [mainFeedList addObjectsFromArray:feedList];

  for(int i = 0; i < mainFeedList.count; i++){

    NSMutableArray *allFeed = [NSMutableArray array];

    NSString *categoryId = [mainFeedList[i] valueForKey: @"categoryId"];

    [allFeed addObject:mainFeedList[i]];

    if(allFeed != nil && allFeed.count > 0) {

      [feedContent setObject:allFeed
                      forKey:[combinedCategories[(int)[categoryId integerValue]] valueForKey: @"name"]];
    }

示例场景:

NSMutableDictionary *mDict = @{@"key1":@"value1",@"key2": @"value2"};

我知道

[mDict setObject:mArray forKey:@"key1"];

会将对象设置为key1,但我需要的是

将另一个对象添加到key1而不替换现有对象(我需要它们)

4 个答案:

答案 0 :(得分:1)

任何NSDictionary的结构都是&#34;一个对象的一个​​键&#34;。如果您想构建一个映射一个关键多个对象的结构,则需要NSDictionary将关键字映射到集合,例如NSArrayNSMutableArray

NSMutableDictionary *mDict = @{
    @"key1": [@[ @"value1" ] mutableCopy]
,   @"key2": [@[ @"value2" ] mutableCopy]
};

现在,您可以在不替换现有键的情况下为键添加值:

[mDict[@"key1"] addObject:@"value3"];

答案 1 :(得分:0)

NSDictionary仅允许与单个键对应的单个对象。如果您想添加对应于单个键的多个对象,如果您有字符串类型的对象,那么您也可以使用分隔符来组合字符串,如:

[mDict setObject:[NSString stringWithFormat:@"%@,%@", [mDict objectforKey:@"key1"], @"value2"] forKey:@"key1"];

否则,您必须收集已在问题中定义的集合。

答案 2 :(得分:0)

将另一个对象添加到key1而不替换现有对象...

为什么不将dict设置为key1?

之前:

#include <string> std::string getStringA() { std::string myString = "SomeString"; return myString; } const std::string getStringB() { std::string myString = "SomeString"; return myString; } int main() { const std::string temp; std::string &a1 = getStringA(); // std::string& a1, warning C4239 : nonstandard extension used : 'initializing' : conversion from 'std::string' to 'std::string &' auto &a2 = getStringA(); // std::string& a2, warning C4239 : nonstandard extension used : 'initializing' : conversion from 'std::string' to 'std::string &' const std::string &a3 = getStringA(); // all good auto &b1 = getStringB(); // const std::string& b1 auto &b2 = temp; // const std::string& b2 }

你想:

添加@&#34; b&#34;到了&#34; key1&#34;,在dict;

为什么不喜欢:

[dict setObject:@"a" forKey:@"key1"];

答案 3 :(得分:0)

我建议将数组存储为字典中的键,如下所示:

// Setting the value for "key1" to an array holding your first value
NSMutableDictionary *mDict = @{@"key1":@["value1"],@"key2": @"value2"};

现在,当我想添加新值时,我会这样做:

// Create temp array
NSMutableArray *temp = mDict[@"key1"];

// Add new object
[temp addObject:@"value3"];

// Convert temp NSMutableArray to an NSArray so you can store it in your dict
NSArray *newArray = [[NSArray alloc] initWithArray:temp];

// Replace old array stored in dict with new array
mDict[@"key1"] = newArray;

此外,如果您不确定是否已为该键存储了数组,则可以运行检查并使用如下所示的空字典进行填充:

if (mDict[@"key1"] == nil) {
    mDict[@"key1"] = @[];
}