传统数组的缺点

  • NSArray与NSMutableArray是OC中的数组
  • 存储数据的特点每1个元素紧密相连.并且每1个元素中都是直接存储的值

缺点:数组元素的下标不固定,都有可能会发生变化.无法通过下标来唯一确定数组中的元素

e.g. 对传统数组进行增,删的时候,元素的下标可能会发生变化

Key-Value 键值对

有一种存储数据的方式存储到数组中,可以快速唯一的确定数组的元素

存储数据的时候.为存储的数据取1个别名

这个别名的作用:就是用来确定别名对应的数据的

要找存储在数组中的数据,使用别名来找而不是通过下标来找因为下标有可能会发生变化,这种存储数据的方式就叫做 键值对 的存储方式

Key-Value

  • Key就是键就是为数据取得别名
  • Value就是值就是真正存储的数据

NSDictionary 与 NSMutableDictionary

  • 它们是数组,只不过是以键值对的形式存储数据的。
  • 往这个数组中存储数据的同时。必须要指定这个数据的别名才可以。要找到存储在这个数组中的数据通过别名来找而不是通过下标。

NSDictionary

NSDictionary存储数据的原理

  • 以键值对的形式存储数据。
  • 字典一旦创建,其中的元素就无法动态的新增和删除。
  • 键:只能是遵守了NSCoping协议的对象。而NSString就是遵守了这个协议。 值:只能是0C对象。

创建字典

  1. NSDictionary *dict1= [NSDictionary new];
  2. NSDictionary *dict2 = [[NSDictionary alloc] init];
  3. NSDictionary *dict3= [NSDictionary dictionary];
  • 这种方式创建出来的字典中没有任何元素.所以没有意义。

一般创建方式

  1. + (instancetype)dictionarywithobjectsAndKeys:(id)firstobject,...
  • 将字典的值键挨个的写在后面初始化。
  1. NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"北京市XX街道",@"address",nil];

简要创建方式

//NSDictionary *dict = @{键1:值1,键2:值2,键3:值3,.........};

NSDictionary *dict = @{@"name":@"rose",@"age":@"18",@"addredd":@"BeiJingXXSttreet"};

使用字典

如何取出存储在字典中的数据

  • 存储在字典中的元素不能使用下标去取,而是用键,也就是别名去取。

使用中括弧的方式

  • 字典名[键] 这样就可以去到字典中这个键对应的值。
NSLog(@"%@",dict[name]); //取出dict字典数组中@"name"这个键对应的值

调用字典对象的方法也可以取出键对应的值

- (nullable ObjectType)objectForKey:(KeyType)aKey;
  • 如果给定的key在数组中不存在,取到的值是nil,不会报错。

字典的键值对的个数

@property (readonly) NSUInteger count;

往字典中存储键值对的时候,键不允许重复

如果键重复,后加的无效

遍历字典

  • 字典中的数据无法使用下标去取,所以普通的for循环遍历下标法不行。
  • 使用for in循环,遍历出来的是字典中所有的键,再通过键取出对应的值。
NSDictionary *dict = @{
    @"name":@"rose",
    @"age":@"18",
    @"address":@"BeiJingXXSttreet"
};

for(id item in dict)
{
    NSLog(@"%@ = %@",item,dict[item]);
}
  • 也可以使用block遍历
[dict enumerateKeysAndobjectsUsingBlock:^(id_Nonnull key, id _Nonnull obj, BOOL *_Nonnull stop){
                NSLog(@"%@ = @",key,obj);
}];

NSMutableDictionary

  • 是NSDictionary的子类,所以NSMutableDictionary也是1个字典
  • NSMutableDictionary在父类基础之上做的扩张
  • 存储在其中的元素可以动态的新增和删除

创建可变字典数组

NSMutableDictionary *dict1= [NSMutableDictionary new];
NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict3 = [NSMutableDictionary dictionary];
  • 这样创建出来的可变字典数组的长度为0但是有意义因为可以动态的新增和删除,
NSMutableDictionary *dict = [NSMutableDictionary
dictionaryWithObjectsAndKeys:@"jack",@"name",@"18",@"age",nil];
  • 在创建可变字典数组的同时初始化键值对。
  • 注意:NSMutableDictionary *dict=@{};这样是不行的

如何新增键值对

- (void) setobject:(ObjectType)anObject forKey:(KeyType<NSCopying>)aKey;

如何删除

- (void) removeAllobjects;     //删除所有的键值对.
- (void) removeObjectForkey:(KeyType)aKey;   //删除指定的键值对。

也可以将字典数组的信息持久化起来

//将字典数组的信息保存到plist文件中
- (BOOL) writeToFile:(NSString *)path atomically: (BOOL)useAuxiliaryFile; 


//从plist文件中还原回字典
+ (nullable NSDictionary<KeyType, ObjectType> *)dictionaryWithContentsOfFile:(NSString *)path;