iPhone - 更改子子NSMutableDictionary值

时间:2011-05-11 00:09:27

标签: iphone nsdictionary key-value

如果我有一个类似的数据树:

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转换为可变词典
然后设置key1

将数组转换为可变数组
然后将dict3设置为数组

将dict2转换为可变词典
然后将数组设置为dict2

将dict1转换为可变词典
然后将dict2设置为dict1

为我必须改变的每个值执行此操作是一件非常令人头痛的问题,而且非常耗费代码。

2 个答案:

答案 0 :(得分:2)

除非你有一个指向该对象的指针,否则你不能向对象发送消息,所以在基本意义上你的问题的答案是否定的,没有别的办法。

但是,假设您拥有的这种数据结构代表某种数据模型。因此,它应该包含在某种理解其部分的模型类中,并且该类应该是唯一需要了解数据存储方式的类。模型类应该为数据提供更高级别的接口。说dict3代表车队中的一个特定车辆,钥匙是“vehicleTag”,“registrationDate”,“purchaseDate”等等。也许dict2级别的词典表示不同地区的车队,而dict2本身代表东北舰队。然后,VehiclePool类(存储所有数据的模型类)可能提供如下方法:

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

我不确定我是否真的想要这样的API - 我更愿意获取给定车队的车辆列表,然后对那些具有更简单的访问器的车辆进行操作,但您似乎想要避免几个访问者的级别。这里的要点是你不应该编写大量的代码来完成你需要的操作;你应该编写知道如何访问数据然后调用它们的方法。

答案 1 :(得分:2)

NSDictionary文档声明:

  

通常,密钥可以是任何对象(前提是它符合NSCopying协议 - 见下文),但请注意,使用键值编码时,密钥必须是字符串(请参阅“键值编码基础”) )。

因此,如果您的键(和子键)都是字符串,您可以执行以下操作来检索和设置值:

id myNestedObject = [topLevel valueForKeyPath:@"firstKey.secondKey.thirdKey"];
[topLevel setObject:newNestedObject forKeyPath:@"firstKey.secondKey.thirdKey"];