Objective C。 NSMutable 字典向现有键添加值

Objective C. NSMutable Dictionary adding value to existing key

有什么方法可以为 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 添加另一个对象(我都需要)

任何NSDictionary的结构是"one key to one object"。如果您想构建一个映射一个键多个对象的结构,您需要一个 NSDictionary 将键映射到集合,例如 NSArrayNSMutableArray:

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

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

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

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

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

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

在不替换现有对象的情况下向 key1 添加另一个对象...

为什么不给 key1 设置一个字典?

之前:

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

你想要:

在字典中添加@"b"到"key1";

为什么不喜欢:

[dict setObject:@{@"a":@"subKey1", @"b":@"subKey2"} forKey:@"key1"];

我建议像下面这样在字典中存储一个数组作为键:

// 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"] = @[];
}