iPhone - Изменение значения sub-sub-sub-sub NSMutableDictionary - PullRequest
1 голос
/ 11 мая 2011

Если у меня есть дерево данных, которое выглядит примерно так:

NSMutableDictionary (dict1)
   NSMutableDictionary (dict2)
      NSMutableArray (array)
        NSMutableDictionary (dict3)
           Key1
           Key2

        NSMutableDictionary (dict_n)
           Keyn
           Keyn

   NSMutableDictionary (dict_n)
      NSMutableArray (array_n)
        NSMutableDictionary (dict_n)
           Keyn
           Keyn

        NSMutableDictionary (dict_n)
           Keyn
           Keyn

Если я хочу изменить значение Key1, есть ли более простой способ, чем ...

получая dict1
затем получаю dict2
затем получить массив
затем получаю dict3

преобразование dict3 в изменяемый словарь
затем настройка ключа 1

Преобразование массива в изменяемый массив
затем установка dict3 в массив

преобразование dict2 в изменяемый словарь
затем установите массив в dict2

преобразование dict1 в изменяемый словарь
затем установка dict2 в dict1

Выполнение этого для каждого значения, которое я должен изменить, является настоящей головной болью и действительно потребляет код.

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Документация NSDictionary гласит:

Как правило, ключом может быть любой объект (при условии, что он соответствует протоколу NSCopying - см. Ниже), но обратите внимание, что при использовании кодирования значения ключа ключ должен быть строкой (см. «Основы кодирования значения ключа»). ).

Поэтому, если все ваши ключи (и вложенные ключи) являются строками, вы можете сделать следующее для получения и установки значений:

id myNestedObject = [topLevel valueForKeyPath:@"firstKey.secondKey.thirdKey"];
[topLevel setObject:newNestedObject forKeyPath:@"firstKey.secondKey.thirdKey"];
2 голосов
/ 11 мая 2011

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

Однако предполагается, что эта имеющаяся у вас структура данных представляет собой своего рода модель данных. Как таковой, он, вероятно, должен содержаться в некотором классе модели, который понимает его части, и этот класс должен быть единственным, который должен понимать, как хранятся данные. Класс модели должен предлагать интерфейс данных более высокого уровня. Скажем, dict3 представляет одно конкретное транспортное средство во флоте, а ключами являются такие вещи, как «vehicleTag», «registrationDate», «purchaseDate» и т. Д. Возможно, словари на уровне dict2 представляют флоты в разных регионах, а сам dict2 представляет северо-восточный флот. , Тогда класс VehiclePool, класс вашей модели, в котором хранятся все данные, может предлагать такие методы:

-registrationDateForVehicle:(int)vehicleIndex inFleet:(NSString*)fleetKey;
-setRegistrationDate:(NSDate*)regDate forVehicle:(int)vehicleIndex inFleet:(NSString*)fleetKey;

Я не уверен, что мне действительно нужен такой API - я бы предпочел получить список транспортных средств для данного парка, а затем оперировать на тех, у которых более простые средства доступа, но вы, кажется, хотите избежать нескольких уровни доступа. Дело в том, что вам не нужно писать тонну кода для выполнения необходимых операций; Вы должны написать методы, которые знают, как получить доступ к данным, а затем вызвать их.

...