NSMutableDictionary,作为可变字典,其中的可变和可变字符串,可变数组是一样的。NSMutableDictionary是继承自NSDictionary的,所以上一篇文章中的一些属性和方法在这里都是适用的。下面来看看NSMutableDictionary的定义和初始化。
创建可变字典对象,定义并初始化:
定义NSMutableDictionary对象的类方法,numItems是字典中元素的个数。这个方法其实就是向内存申请了一定的内存空间。
+ (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;
由于NSMutableDictionary是继承自NSDictionary的,NSDictionary是继承自NSObject的,所以适用alloc也可以创建一个可变字典对象,适用方法如下:- (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;
NSMutableDictionary *dic1 = [[NSMutableDictionary alloc]initWithCapacity:10];
NSMutableDictionary *dic2 = [[NSMutableDictionary alloc]init];
上面两中创建形式的区别在于第一个申请了10个元素的空间,第二个只是创建了一个对象。和数组一样,当我们不知道要申请多少空间的时候。我们可以个 dictionaryWithCapacity:方法或者initWithCapacity:方法传递0作为参数。可变字典的初始化赋值,是使用NSDictionary的赋值方法。
可变字典常用操作方法
在字典后添加一个字典,也是字典后面拼接一个字典。
- (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
删除字典中所有的元素
- (void)removeAllObjects;
根据key数组,删除对应的元素
- (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray;
根据key删除一个对应的元素
- (void)removeObjectForKey:(KeyType)aKey;
使用一个新的字典覆盖原来字典的数据- (void)setDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
使用key:value形式修改字典中key对应的元素值
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key NS_AVAILABLE(10_8, 6_0);
代码示例://创建字典对象,初始化
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:
@"value1", @"key1",
@"value2", @"key2",
@"value3", @"key3",
@"value4", @"key4",
nil];
//定义可变字符串对象
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:dic1];
NSLog(@"初始的字典:%@", dic);
NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:
@"value5", @"key5",
@"value6", @"key6",
@"value7", @"key7",
@"value8", @"key8",
nil];
//字典拼接
[dic addEntriesFromDictionary:dic2];
NSLog(@"拼接后的字典:%@", dic);
//修改key1对应的值
[dic setObject:@"aaa" forKeyedSubscript:@"key1"];
NSLog(@"修改后的字典:%@", dic);
NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:
@"value11", @"key11",
@"value22", @"key22",
@"value33", @"key33",
@"value44", @"key44",
@"value55", @"key55",
@"value66", @"key66",
nil];
//字典覆盖
[dic setDictionary:dic3];
NSLog(@"覆盖后的字典:%@", dic);
//删除一个元素
[dic removeObjectForKey:@"key11"];
NSLog(@"删除key1后的字典:%@", dic);
//根据数组删除多个元素
NSArray *array = @[@"key33", @"key22"];
[dic removeObjectsForKeys:array];
NSLog(@"删除key2、key3后的字典:%@", dic);
//删除所有字典元素
[dic removeAllObjects];
NSLog(@"删除所有元素后的字典:%@", dic);
打印结果:
2017-03-24 13:31:08.708 OCdemo[3060:333844] 初始的字典:{
key1 = value1;
key2 = value2;
key3 = value3;
key4 = value4;
}
2017-03-24 13:31:08.709 OCdemo[3060:333844] 拼接后的字典:{
key1 = value1;
key2 = value2;
key3 = value3;
key4 = value4;
key5 = value5;
key6 = value6;
key7 = value7;
key8 = value8;
}
2017-03-24 13:31:08.709 OCdemo[3060:333844] 修改后的字典:{
key1 = aaa;
key2 = value2;
key3 = value3;
key4 = value4;
key5 = value5;
key6 = value6;
key7 = value7;
key8 = value8;
}
2017-03-24 13:31:08.709 OCdemo[3060:333844] 覆盖后的字典:{
key11 = value11;
key22 = value22;
key33 = value33;
key44 = value44;
key55 = value55;
key66 = value66;
}
2017-03-24 13:31:08.709 OCdemo[3060:333844] 删除key1后的字典:{
key22 = value22;
key33 = value33;
key44 = value44;
key55 = value55;
key66 = value66;
}
2017-03-24 13:31:08.710 OCdemo[3060:333844] 删除key2、key3后的字典:{
key44 = value44;
key55 = value55;
key66 = value66;
}
2017-03-24 13:31:08.710 OCdemo[3060:333844] 删除所有元素后的字典:{
}
Program ended with exit code: 0
这些就是字典的常用操作了,在实际的开发中,所能到的也就是这样的操作。
在我昨天写代码的时候,遇到一个关于字典数据转换赋值的问题。
读取字典数据的方法是objectForKey:方法,当我们需要读取字典中的数据,给其他变量赋值的时候,数据类型的对应关系一定要注意,特别是使用到BOOL这个类型的时候,即使字典中对应的类型也是BOOL类型,也要在读取后进行一次转换才可以赋值给变量,不然会发现所有的BOOL类型变量都是YES。
关于字符串、数组、字典的操作其实不多,但是在实际开发中的应用却很重要。因为在开发中就只有3部分:视图、数据、逻辑。对于数据的操作,其实就是对字符串、数组、字典、还有其他类型数据的操作,只是要加上操作处理逻辑。但是无论如何操作,都是使用这些最基础的操作方法进行的,这些基础的东西才是最重要的。以前总是不愿意去看这些基础的东西,在开发中,也总是想不起来这些基础的操作是什么,每次用到的时候都去baidu。耽误了时间也显得自己技术很差,特别是在面试的时候,当面试官问到一些处理的时候,既然都说不出操作方法名,真的很失败。。。。
这次回头来复习的目的就是要好好梳理这些最基础的东西,希望自己可以坚持下去,加油!