如果我有一个类似的数据树:
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
为我必须改变的每个值执行此操作是一件非常令人头痛的问题,而且非常耗费代码。
答案 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"];