#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, и у него есть хорошее решение для этого.