1. 先回顾一下NSArray和NSMutbaleArray.
是OC中的数组.
NSMutableArray数组的缺点:
NSMutableArray数组中的元素一旦删除.
这个元素后面的元素的下标会发生变化 会往前顶.
下标不靠谱. 要找到数组中特定的1个元素 不要使用下标去找,因为元素的下标可能会发生变化.
需求: 希望有一种靠谱的方式来快速定位数组中的元素.
每存储1个数据,都要求为这个数据取1个别名,
要找存储在数组中的数据的时候,不是通过下标来找,而是通过别名来找.
这样就算数组的元素的下标发生了变化. 不影响我们查找数据.因为我们不是通过下标来找数据 而是通过别名来找.
这中存储数据的方式我们叫做 键值对 的存储方式.
每存储1个数据(值) Value,都要为这个数据取1个别名(键).Key
NSDictionay 和 NSMutableDictionary 就是以键值对的形式来存储数据的.
2. NSDictionary数组.
1). 不可变字典数组.
2). 特点:
a. 首先是1个数组.
b. 是以键值对的形式来存储数据的
c. 存储的数据只能是OC对象.别名只能是遵守了NSCopying协议的OC对象. NSString就是遵守这个协议的.
d. 存储的键值对是固定的.不能动态的新增和删除.
3. 创建NSDictionary字典数组.
1). 这是1个类.要使用它的话,就必须要创建对象来使用.
NSDictionary *dict1 = [NSDictionary new];
NSDictionary *dict2 = [[NSDictionary alloc] init];
NSDictionary *dict3 = [NSDictionary dictionary];
这样的创建出来的字典数组,没有意义.这个时候这个字典数组的长度为0
而这个字典数组无法新增和删除元素.所以没有意义.
2). 常用的创建字典数组的方法
+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"rose",@"name",@"18",@"age",@"178.5",@"height",nil];
依次的将值、键写在参数.最后1个写nil
3). 简要NSDictionary字典数组的方式.
NSDictionary *dict = @{键1:值1,键2:值2,键3:值3 ......};
NSDictionary *dict = @{
@"name":@"rose",
@"age":@"18",
@"height":@"178.6"
};
4. 如何取出存储在字典数组中的数据.
1). 字典数组中的数据不能使用下标去取.只能使用Key取Key对应的值.
2). 如何使用key取到这个key所对应的值.
a. 使用中括弧,在中括弧中写上别名,就可以取到这个别名对应的数据.
dict[别名];
b. 调用字典对象的方法.
- (nullable ObjectType)objectForKey:(KeyType)aKey;
如果给定的Key不存在,取到的就是nil.
5. 取到字典数组中键值对的个数.
@property (readonly) NSUInteger count;
6. 字典数组中的键是不能重复的. 因为键是用来区分字典数组中值的唯一标识.
如果键重复???????
7. NSDictionary字典数组的遍历.
1). 因为 NSDictionary字典数组中的取值是依靠键来取值的.无法通过下标来取值.
所以,for循环遍历下标的方式就不可以的啦...
2). 使用for in 循环.
注意的1点是: 遍历出来的数据是字典中的Key,要取值的话,还要通过Key去取值.
for(NSString *key in dict)
{
NSLog(@"%@ = %@",key,[dict objectForKey:key]);
}
3). 使用block来遍历字典数组.
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(KeyType key, ObjectType obj, BOOL *stop))block
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
//key 遍历出来的键.
//obj 遍历出来的值.
//stop指针.
NSLog(@"%@ = %@",key,obj);
if([key isEqualToString:@"age"])
{
*stop = YES;
}
}];
8. NSDictionary数组存储数据的原理.
1). 当我们往字典数组中存储键值对的.这个键值对不是挨个挨个的存储的.
2). 当我们要往这个字典数组中存储1个键值对的时候,
这个键值对要存储到哪1个下标中呢 ?
根据键做1个哈希算法和数组的长度 算出1个下标来.
然后把这个键值对存储到这个字典数组中对应下标处.
3). 我们取值是通过key取值的.
这个时候,仍然是根据这个Key做1个哈希算法.
算出这个key所在的下标 让后取值.
与NSArray的区别.
1). NSArray是1个1个的挨个存储.
NSDictionary不是挨个存储的.每1个键值对要存储在哪个下标处 都是通过算出来的.
所以,存储数据的时候,肯定是NSArray的效率高1些.
2). 取数据的时候.
如果我们要讲数组中的所有的元素取出来.
取的时候,肯定是NSArray快.
NSArray挨个挨个的取就可以 而字典每取1个就要算1下.
3). 使用场景.
如果我们往数组中存储数据,存储进去以后,凡是要取数据都是全部取出来.使用NSArray.
` 如果取值的时候,只会取其中的特定的几个. 使用 组.
-------------------------------
1. NSMutableDictionary.可变字典数组.
1). 是NSDictionary的子类. 所以它也是以键值对的形式来存储数据.
和父类的不同之处: 键值对可以动态的新增和删除.
2. 创建可变字典数组.
NSMutableDictionary *dict1 = [NSMutableDictionary new];
NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict3 = [NSMutableDictionary dictionary];
上面的这些方法创建出来的可变字典的长度是0 这是有意义的.因为可以动态的新增和删除.
NSMutableDictionary *dict4 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"17",@"age",nil];
注意:
NSMutableDictionary *dict3 = @{}; 这么做是不行的.
3. 如何新增键值对.
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;
值可以是任意的OC对象.
键必须是遵守了NSCopying协议的对象. NSString就是遵守了这个协议.
如果键重复,后新增会将前面的值覆盖掉.
值是可以重复的
4. 删除键值对.
[dict removeAllObjects];//全部清空.
[dict removeObjectForKey:@"name"];//删除这个键对应的键值对.
5. 字典数组也可以持久化为1个plist文件.
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
//将pist文件还原为1个字典 返回值的类型NSDictionary
//但是实际的对象,是1个可变的.
+ (nullable NSDictionary<KeyType, ObjectType> *)dictionaryWithContentsOfFile:(NSString *)path;
|
|