[Objective-C]NSDictionary与NSMutableDictionary详解

文章目录

  • NSDictionary
    • NSDictionary字典数组的特点:
    • NSdictionary数组与NSArray数组对比
    • 创建NSDictionary数组
    • NSDictionary数组的使用
    • 遍历字典数组
  • NSMutableDictionary
    • 特点:
    • 创建可变字典数组
    • 遍历字典数组
    • 添加元素
    • 删除元素
  • 数组的文件操作

NSDictionary

NSDictionary字典数组的特点:

1.都是数组,以键值对的形式存储数据的,向数组汇总存储数据的同时要为其指定别名,通过别名来查找数据,而不是通过下标
2.字典数组一旦创建,无法动态新增
3.键:只能是遵守NSCoping协议的对象(例如NSString)
  值:只能是OC对象

NSdictionary数组与NSArray数组对比

1.NSArray数组的元素是顺序存储的
  NSDictionary字典数组是通过一个哈希函数来计算出键值对存储位置的
2.存数据的效率:NSArray更高
  取数据的效率:
        a.如果需要取出全部数据,NSArray效率高(顺序存取)
        b.如果只取出指定的几个数据,NSDictionary效率更高(通过别名和哈希函数计算存储位置,再取数据)

创建NSDictionary数组

1.创建空字典数组---无意义
     NSDictionary *dict1 = [NSDictionary new];
     NSDictionary *dict2 = [[NSDictionary alloc] init];
     NSDictionary *dict3 = [NSDictionary dictionary];
2.常用创建方法-先值后键
    + (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...

  eg: NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Saber",@"Servant",@"Emiya",@"Master", nil]; //dictionaryWithObjectsAndKeys:[值,键,值,键,nil]
3.简要创建方式-先键后值,
    NSdictionary   *dict = @{键1:值1,键2:值2,键3:值3,......};
   eg: NSDictionary *dict = @{@"Master":@"Tohsaka",@"Servant":@"Archer"};

NSDictionary数组的使用

1.取出数组中的值
    a.别名法
        数组名[别名];
        NSLog(@"%@",dict[@"Master"]);
    b.调用字典数组对象方法
        - (nullable ObjectType)objectForKey:(KeyType)aKey;
        如果给定的值在数组中不存在,会取到nil,不会报错
        eg: NSLog(@"%@",[dict objectForKey:@"Servant"]);
2.获得字典数组的键值对个数
    @property (readonly) NSUInteger count;
    eg: NSLog(@"dicti.count = %lu",dict.count);
3.字典数组中的键不允许重复,如果键重复了,后面的键无效

遍历字典数组

1.字典数组无法通过下标读取,所以普通的for循环无法遍历字典数组
2.使用 for in 循环遍历出来的是字典中所有的键,可以再通过键来获取对应值
    NSDictionary *dict = @{@"Master":@"Tohsaka",@"Servant":@"Archer"};
    eg1: for(id item in dict) {
            NSLog(@"%@",item);
        }
        打印结果:Master  Servant
    
    eg2: for(id item in dict) {
             NSLog(@"%@ = %@ ",item,dict[item]);
         }
         打印结果:Master = Tohsaka   Servant = Archer
3.通过block方式遍历
		[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
 NSLog(@"%@ = %@",key,obj);}];
 
//通过key获取键,obj获取值,stop用于控制循环停止

NSMutableDictionary

特点:

1.是NSDictionary的子类,也是一个字典数组,以键值对的形式存储数据
2.重点:NSMutableDictionary在父类基础上做了扩展:
    a.NSMutableDictionary中的元素可以动态的新增和删除

创建可变字典数组

1.创建空数组---有意义
     NSMutableDictionary *dict1 = [NSMutableDictionary new];
     NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
     NSMutableDictionary *dict3 = [NSMutableDictionary dictionary];
2.简要创建并初始化
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"Saber",@"Servant",@"Emiya",@"Master", nil];
    
    注意:不能通过下面这种方法来创建可变字典数组
        NSMutableDictionary *dict = @{};//error 子类的指针不能指向父类对象

遍历字典数组

与NSDictionary遍历方法一致,往前翻翻吧

添加元素

  • (void)setObject:(ObjectType)anObject forKey:(KeyType )aKey;
    注意:如果键重复了,那么后添加值的会替换原来的值

删除元素

1.删除所有元素:
    - (void)removeAllObjects;
2.通过键删除
    - (void)removeObjectsForKeys:(NSArray *)keyArray;

数组的文件操作

1.将字典存放进plist文件
    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile
   eg: [dict writeToFile:@"/Users/heyuxuan/Desktop/dict.plist" atomically:NO];
2.从plist文件读取数据用于存进字典
    + (nullable NSDictionary *)dictionaryWithContentsOfFile:(NSString *)path
   eg: NSDictionary *dict1 = [NSDictionary dictionaryWithContentsOfFile:@"/Users/heyuxuan/Desktop/dict.plist"];

你可能感兴趣的:(Objective-C,objective-c,ios,xcode)