传统数组的缺点
- NSArray与NSMutableArray是OC中的数组
- 存储数据的特点每1个元素紧密相连.并且每1个元素中都是直接存储的值
缺点:数组元素的下标不固定,都有可能会发生变化.无法通过下标来唯一确定数组中的元素
e.g. 对传统数组进行增,删的时候,元素的下标可能会发生变化
Key-Value 键值对
有一种存储数据的方式存储到数组中,可以快速唯一的确定数组的元素
存储数据的时候.为存储的数据取1个别名
这个别名的作用:就是用来确定别名对应的数据的
要找存储在数组中的数据,使用别名来找而不是通过下标来找因为下标有可能会发生变化,这种存储数据的方式就叫做 键值对 的存储方式
Key-Value
- Key就是键就是为数据取得别名
- Value就是值就是真正存储的数据
NSDictionary 与 NSMutableDictionary
- 它们是数组,只不过是以键值对的形式存储数据的。
- 往这个数组中存储数据的同时。必须要指定这个数据的别名才可以。要找到存储在这个数组中的数据通过别名来找而不是通过下标。
NSDictionary
NSDictionary存储数据的原理
- 以键值对的形式存储数据。
- 字典一旦创建,其中的元素就无法动态的新增和删除。
- 键:只能是遵守了NSCoping协议的对象。而NSString就是遵守了这个协议。 值:只能是0C对象。
创建字典
NSDictionary *dict1= [NSDictionary new];
NSDictionary *dict2 = [[NSDictionary alloc] init];
NSDictionary *dict3= [NSDictionary dictionary];
- 这种方式创建出来的字典中没有任何元素.所以没有意义。
一般创建方式
+ (instancetype)dictionarywithobjectsAndKeys:(id)firstobject,...
- 将字典的值键挨个的写在后面初始化。
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;