iOS — использование NSMutableDictionary для группировки

#objective-c #ios

#objective-c #iOS

Вопрос:

У меня есть метод, которому передается dict (значения которого сами состоят из вложенных dict), и я использую рекурсию для обхода этого dict, и я хочу сохранить только нужную мне информацию в другом dict, который также передается методу в качестве второго аргумента.

Итак, метод (игнорирующий некоторые необязательные аргументы, необходимые для облегчения рекурсии) выглядит следующим образом:

 -(NSMutableDictionary*) extractData: (NSDictionary*)complicatedDict intoSimpleDict:(NSMutableDictionary*)simpleDict {
    // do recursive traversal of complicatedDict and return simpleDict
}
  

Я сталкиваюсь с двумя проблемами:

a. Мне нужно сначала передать пустой dict при первом вызове метода. Как мне инициализировать пустой NSMutableDictionary для передачи в качестве параметра simpleDict?

б. Я пытаюсь сгруппировать значения, имеющие общий ключ, в simpleDict. На JS (который является моим самым знакомым языком) я буду реализовывать его следующим образом:

 if( !simpleDict.hasOwnProperty('some_key') ) {
    simpleDict['some_key'] = [];
}
simpleDict['some_key'].push("value");
  

Приведенный выше код изначально будет содержать массив в каждом индексе dict и вставлять в него значение. Как мне это сделать в objective-c?

Комментарии:

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

Ответ №1:

a. Создайте пустой изменяемый словарь просто так

 NSMutableDictionary *empty = [NSMutableDictionary dictionary];
  

б. Это эквивалентно вашему примеру JS

 if(![[simpleDict allKeys] containsObject:@"some_key"])
    [simpleDict setObject:[NSMutableArray array] forKey:@"some_key"];
[[simpleDict objectForKey:@"some_key"] addObject:@"value"];
  

Ответ №2:

a. Здесь у вас есть несколько вариантов. Во-первых, вы могли бы просто вызвать свой метод следующим образом:

 [myObject extractData:complicatedDict intoSimpleDict:[NSMutableDictionary dictionary]];
  

Это создаст автоматически выпущенный объект словаря, которым вы можете управлять в теле вашего метода и возвращать. Просто помните, что тот, кому нужно сохранить этот словарь, должен сохранить его.

Другой способ — просто создать словарь в теле метода:

 -(NSMutableDictionary*) extractData:(NSDictionary*)complicatedDict {
    NSMutableDictionary *simpleDict = [NSMutableDictionary dictionary];
    // do recursive traversal of complicatedDict and return simpleDict
    return simpleDict;
}
  

б. Только что увидел сообщение @Joe, и у него есть хорошее решение для этого.