oc——Foundation框架——字典

NSDictionary的功能与用法

NSDictionary分别提供了类方法和实例方法来创建NSDictionary,类方法以dictionary开头,实例方法则以init开头,下面是创建NSDictionary对象的几类常见的方法:

🎇dictionary:创建一个不包含任何key-value对的NSDictionary。
🎇dictionaryWithContentsOfFile:/initWithContentsOfFile::读取指定文件的内容,使用指定的文件内容来初始化NSDictionary。该文件通常是由NSDictionary输出生成的。
🎇dictionaryWithDictionary:/initWithDictionary::使用已有的NSDictionary包含的key-value对来初始化NSDictionary对象。
🎇dictionaryWithObject:forKey::使用单个key-value对来创建NSDictionary对像。
🎇dictionaryWithObjects:forKeys:/initWithObjects:forKeys::使用两个NSArray分别指定key、value集合,可以创建包含多个key-value对的NSDictionary。
🎇dictionaryWithObjectsAndKeys:/initWithObjectsAndKeys::调用该方法时,需要按value1,key1,value2,key2,…,nil的格式传入多个key-value对。

一旦得到NSDictionary,接下来就可以通过方法来访问该集合所包含的key或value,NSDictionary提供了如下常用的方法:

🎇count:返回所有key-value对数量。
🎇allKeys:返回全部key。
🎇allKeysForObject::返回指定value对应的全部key。
🎇allValues:返回包含的全部value。
🎇objectForKey::获取指定key对应value。
🎇objectForKeyedSubscript::通过该方法的支持,允许通过下标法来获取指定key对应的value。
🎇valueForKey::获取指定key对应的value。
🎇keyEnumerator:返回用于遍历该NSDictionary所有key的NSEnumerator对象。
🎇objectEnumerator:该方法返回用于遍历该NSDictionary所有value的NSEnumerator对象。
🎇enumerateKeysAndObjectsUsingBlock::使用指定的代码块来迭代执行该集合中所有的key-value对。
🎇enumerateKeysAndObjectsWithOptions:usingBlock::使用指定的代码块来迭代执行该集合中所有的🎇key-value对。该方法可以传入一个额外的NSEnumerationOptions参数。
🎇writeToFile:atomically::将该NSDictionary对象的数据写入指定文件。
以下代码是对创建字典几种方法的演示:


#import "NSDictionary.h"
int main() {
    @autoreleasepool {
        NSDictionary * a = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2", nil];
        //利用实例方法创建字典
        NSLog(@"%@",a);
        NSDictionary * b = @{@"key1":@"value1",@"key2":@"value2"};
        //字面量方法创建字典
        NSLog(@"%@",b);
        NSDictionary * c = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
        //利用类方法创建字典
        NSLog(@"%@",c);
        NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
        NSDictionary * dict1 = [[NSDictionary alloc] initWithDictionary:dict];
        //通过字典实例方法进行初始化
        NSDictionary * dict2 = [NSDictionary dictionaryWithDictionary:dict];
        //通过字典类方法进行初始化
        NSLog(@"%@",dict1);
        NSLog(@"%@",dict2);
    }
}

输出结果:
在这里插入图片描述

然后是字典的基本操作代码:

        NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];       
      
        NSString * value1 = [dict objectForKey:@"key1"];
        NSString * value2 = dict[@"key2"];
        NSLog(@"value1=%@,value2=%@",value1,value2);
        //根据key值获取相应值
        
        NSArray * array = [dict allKeys];
        NSLog(@"获取所有的key值为:%@",array);
        //获取字典中所有的key
        
        NSArray * array2 = [dict allValues];
        NSLog(@"获取所有的value值为:%@",array2);
        //获取字典中所有的value

输出结果:
在这里插入图片描述

对NSDictionary的key排序

和对数组排序一样,三种方法:
🎇keysSortedByValueUsingSelector::根据所有value指定方法的返回值对key排序;调用该方法必须返回NSOrderedAscending、NSOrderedDescending、NSOrderedSame这三个枚举值之一。
🎇keysSortedByValueUsingComparator::使用指定的代码块来遍历key-value对,并根据执行结果(必须返回NSOrderedAscending、NSOrderedDescending、NSOrderedSame这三个枚举值之一)对所有key进行排序。
🎇keysSortedByValueWithOptions:usingComparator::与前一个方法的功能类似,只是可以传入一个额外的NSEnumerationOptions参数。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //
        NSDictionary* dict = @{@"key1": @"ccc",
                               @"key2":@"bbbb",
                               @"key3":@"aa",
                               @"key4":@"d"
        };

        //获取所有直接调用value的compare:方法对所有key进行排序
        //返回排序好的所有key组成的NSArray
        NSArray* keyArr1 = [dict keysSortedByValueUsingSelector:@selector(compare:)];
        NSLog(@"%@", keyArr1);
        NSArray* keyArr2 = [dict keysSortedByValueUsingComparator:
        //对value进行比较,字符串越长,即可认为value越大
        ^(id value1, id value2){
            //下面定义比较大小的标准:字符串越长,即可认为value越大
            if([value1 length] > [value2 length]) {
                return NSOrderedDescending;
            } else if ([value1 length] < [value2 length]) {
                return NSOrderedAscending;
            } else {
                return NSOrderedSame;
            }
        }];
        NSLog(@"%@", keyArr2);
    }
}


输出结果:
在这里插入图片描述

NSMutableDictionary的功能与用法

NSMutableDictionary继承了NSDictionary,它代表一个key-value对可变的NSDictionary集合。由于NSMutableDictionary可以动态地添加key-value对,因此,创建NSMutableDictionary集合时可以指定初始容量。
NSMutableDictionary主要新增了如下方法:

🎇setObject:forKey::设置一个key-value对。如果NSDictionary中没有包含与该key相同的key-value对,那么NSDictionary将会新增一个key-value对;否则该key-value对将覆盖已有的key-value对。
🎇setObject:forKeyedSubscript::通过该方法的支持,允许程序通过下标法来设置key-value对。
addEntriesFromDictionary::将另一个NSDictionary中所有的key-value对复制到当前NSDictionary中。
🎇setDictionary::用另一个NSDictionary中所有的key-value对替换当前NSDictionary中的key-value对。
🎇removeObjectForKey::根据key来删除key-value对。
🎇removeAllObjects:清空该NSDictionary。
🎇removeObjectsForKeys::使用多个key组成的NSArray作为参数,同时删除多个key对应的key-value对。

我们先按照最先对普通字典的理解对可变字典初始化。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableDictionary * a= [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
        //通过类方法初始化
        NSMutableDictionary * b = [NSMutableDictionary dictionaryWithDictionary:a];
        //通过字典的类方法初始化
        NSMutableDictionary * c = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};
        //通过字面量方法初始化
        NSMutableDictionary * d = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2", nil];
        //通过实例方法初始化
        NSMutableDictionary * e = [[NSDictionary alloc] initWithDictionary:a];
        //通过字典的实例方法初始化
        NSLog(@"%@",a);
        NSLog(@"%@",b);
        NSLog(@"%@",c);
        NSLog(@"%@",d);
        NSLog(@"%@",e);
    }
}

输出结果:
在这里插入图片描述
我们可以看出来貌似是没有问题的。
然后我们挑一些可变字典新增的方法来看看。
为了看起来比较明显,我们对原来五个字典的值作以改变。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableDictionary * a= [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", @"value3", @"key3", @"value5", @"key5", nil];
        //通过类方法初始化
        NSMutableDictionary * b = [NSMutableDictionary dictionaryWithDictionary:a];
        //通过字典的类方法初始化
        NSMutableDictionary * c = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};
        //通过字面量方法初始化
        NSMutableDictionary * d = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value4",@"key4", nil];
        //通过实例方法初始化
        NSMutableDictionary * e = [[NSMutableDictionary alloc] initWithDictionary:a];
        //通过字典的实例方法初始化
        /*NSLog(@"%@",a);
        NSLog(@"%@",b);
        NSLog(@"%@",c);
        NSLog(@"%@",d);
        NSLog(@"%@",e);*/
        [d addEntriesFromDictionary:a];
        NSLog(@"%@",a);
    }
}

输出结果:
在这里插入图片描述
没有问题,然后我们再来试一下c这个字典。

[c addEntriesFromDictionary: d];
NSLog(@"%@",c);

我们发现程序在编译时没错,运行时出错了。
在这里插入图片描述
因此可以得知可变字典是不能通过字面量创建的,这个问题同样存在于字符串和数组里,在之前的学习中有所疏忽。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值