今天来讲NSMutableDictionary这个基础,是因为在今天的开发中遇到了一个小小的坑,当发现了这个问题后,着实觉得很不应该,所以在这里做一个记录,也同时同他人分享,少走我的弯路。本案例代码上传至 https://github.com/chenyufeng1991/InitNSMutableDictionary 。
今天遇到的问题是这样的,某个方法返回两种结果,NSMutableDictionary或者nil,当然我是用NSMutableDictionary类型来接收返回值。当我要对这个返回值操作时,比如setValue插入数据的时候,发现键值对怎么都不能赋值,顿时让人很不爽。
当然解决这个问题也是很简单的,问题就是无法对一个值为nil的NSMutableDictionary对象插入值,也就是setValue无效。下面我们看两种情况:
(1)当调试程序时,如果发现NSMutableDictionary对象的类型是(NSMutableDictionary*),并且值为nil的时候,是无法setValue的。
。
(2)如果发现NSMutableDictionary对象类型是(_NSDictionaryM *)时,并且值为 0 key/value pairs时,才可以setValue插入。
。
注意可变字典没有类似add ,insert方法,插入数据的方法就是setValue。而且相同的“键”只会被插入一次。
小小的坑作了说明以后,本文就来对NSMutableDictionary的初始化方法做一个较为全面的了解。需要注意的是,NSMutableDictionary的初始化方法主要分为两类,实例方法初始化和类方法初始化。两者基本上是一一对应的关系,也是类似的。
(1)
/**(1) * 这样没有对可变字典进行初始化,也没有任何的意义。也无法使用setValue插入数据。也就是说值为nil的可变字典一般不用。 在调试的时候可以看到,当可变字典类型为(NSMutableDictionary *)nil 时,无法使用setValue插入键值对。 */ NSMutableDictionary *dic = nil;
(2)
/**(2) 以上两种初始化方法一样。观察调试的时候可以发现,当可变字典为 (_NSDictionaryM *) 0 key/value pair ,零个键值对的时候可以setValue插入数据。 */ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; NSMutableDictionary *dic02 = [[NSMutableDictionary alloc] initWithCapacity:1];
(3)
/**(3) 这种初始化方法其实不推荐,这是隐式的使用 [value,key],[value,key]的方式来构造键值对。 */ NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"11",@"2",@"22",nil];
(4)
/**(4) 使用另一个可变字典来初始化某个字典。 */ NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] init]; NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary: dic2];
(5)
/**(5) * 分别使用两个数组来初始化可变字典,一个数组是“键”数组,另一个数组是“值”数组。初始化后键值对会一一进行匹配。 */ NSArray *valueArray = @[@"value01",@"value02”,@“value03"]; NSArray *keyArray = @[@"key01",@"key02",@"key03"]; NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjects:valueArray forKeys:keyArray];
上面的是实例方法初始化,下面的是类方法初始化
(6)
/**(6) * 直接使用类方法初始化。等同于上述(2)。 */ NSMutableDictionary *dic = [NSMutableDictionary dictionary]; NSMutableDictionary *dic1 = [NSMutableDictionary dictionaryWithCapacity:1];
(7)
/**(7) * 等同于上述(3) */ NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"1",@"11",@"2",@"22",nil];
(8)
/**(8) * 直接使用某个键值对初始化字典 */ NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:@"1" forKey:@"11"];
(9)
/**(9) 等同于上述(4) */ NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] init]; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:dic2];
(10)
/** * 等同于上述(5) */ NSArray *valueArray = @[@"value01",@"value02",@"value03"]; NSArray *keyArray = @[@"key01",@"key02",@"key03"]; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjects:valueArray forKeys:keyArray];