前言

	@interface NSDictionary<__covariant KeyType, __covariant ObjectType> : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
@interface NSMutableDictionary<KeyType, ObjectType> : NSDictionary<KeyType, ObjectType>
  • 字典只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil 。字典中的键必须是单值的,通常它们是字符串。

  • 字典对象是无序的,第一个放到词典中的键-对象对并不一定是第一个取出。

  • Xcode 7 对系统中常用的一系列容器类型都增加了泛型支持(),有了泛型后就可以指定容器类中对象的类型了。假如向泛型容器中加入错误的对象,编译器会报警告。

    	__covariant:协变性,子类型可以强转到父类型(里氏替换原则)。
    __contravariant:逆变性,父类型可以强转到子类型。
  • 不指定泛型类型的对象可以和任意泛型类型转化,但指定了泛型类型后,两个不同类型间是不可以强转的,假如你希望主动控制转化关系,就需要使用泛型的协变性和逆变性修饰符。

1、不可变字典的创建

	// 直接创建不可变字典

		// 字典中的 key 和 value 成对出现
NSDictionary *dic1 = @{@"key1":@"value1", @"key2":@"value2"}; // 对象方法创建 NSDictionary *dic2 = [[NSDictionary alloc] init]; // 和 dic1 的地址不相同
NSDictionary *dic3 = [[NSDictionary alloc] initWithDictionary:dic1]; NSDictionary *dic4 = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
NSDictionary *dic5 = [[NSDictionary alloc] initWithObjects:@[@"value1", @"value2", @"value3",]
forKeys:@[@"key1", @"key2", @"key3"]]; // 类方法创建 NSDictionary *dic6 = [NSDictionary dictionary]; // 和 dic1 的地址不相同
NSDictionary *dic7 = [NSDictionary dictionaryWithDictionary:dic1]; NSDictionary *dic8 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
NSDictionary *dic9 = [NSDictionary dictionaryWithObject:@"value1" forKey:@"key1"];
NSDictionary *dic10 = [NSDictionary dictionaryWithObjects:@[@"value1", @"value2", @"value3",]
forKeys:@[@"key1", @"key2", @"key3"]]; // 从 文件 创建字符串 NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"]; NSDictionary *dic11 = [[NSDictionary alloc] initWithContentsOfFile:path];
NSDictionary *dic12 = [NSDictionary dictionaryWithContentsOfFile:path]; // 从 Url 创建字符串 /*
file:// 文件前缀
*/ NSURL *url = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory()
stringByAppendingString:@"/Desktop/test.txt"]]]; NSDictionary *dic13 = [[NSDictionary alloc] initWithContentsOfURL:url];
NSDictionary *dic14 = [NSDictionary dictionaryWithContentsOfURL:url]; // 泛型创建 NSDictionary<NSString *, NSNumber *> *dic15 = @{@"key1":@3, @"key2":@5};

2、字典中元素个数的计算

	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];

	NSUInteger length = [dic count];

3、通过 key 找对应的 value

	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];

	// 通过 key 找对应的 value
NSLog(@"%@", [dic objectForKey:@"key1"]); // 以下标的方式找 key 找对应的 value
NSLog(@"%@", dic[@"key2"]); // key 没有对应的 value 时用 notFoundMarker 参数代替
NSArray *arr = [dic objectsForKeys:@[@"key1", @"key1", @"key3"] notFoundMarker:@"not-Found"];

4、通过 value 找对应的 key

	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2",
@"key2", @"value2", @"key3", nil]; NSLog(@"%@", [dic allKeysForObject:@"value2"]);

5、字典中所有 key 的获取

	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];

	NSLog(@"%@", [dic allKeys]);

6、字典中所有 value 的获取

	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];

	NSLog(@"%@", [dic allValues]);

7、可变字典 NSMutableDictionary 的创建

	// 对象方法创建

		// 创建指定长度的字典,预先分配空间,提高效率,实际长度可大于指定长度
NSMutableDictionary *dic1 = [[NSMutableDictionary alloc] initWithCapacity:0]; // 类方法创建 // 创建指定长度的字典,预先分配空间,提高效率,实际长度可大于指定长度
NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithCapacity:0];

8、字典中键值对的追加

	NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", nil];

	// 向字典末尾追加一个元素(key 值为新增的,若 key 值已存在则为修改对应的 value 值)
[dic setObject:@"value2" forKey:@"key2"]; // 向字典末尾追加一个字典
NSDictionary *dicAdd = @{@"key3": @"value3"};
[dic addEntriesFromDictionary:dicAdd];

9、字典中元素的删除

	NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2",
@"key2", @"value3", @"key3",
@"value4", @"key4", nil]; // 删除指定的 key 对应的 value 和 key 值
[dic removeObjectForKey:@"key3"]; // 删除所有的 value 和 key 值
[dic removeAllObjects];

10、字典中元素的修改

	NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2",
@"key2", @"value3", @"key3",
@"value4", @"key4", nil]; // 修改已存在的键值(key 值为已经存在的,若 key 值为新增的则为追加对应的 value 值)
[dic setObject:@"value5" forKey:@"key1"]; // 修改整个字典(覆盖重写)
NSDictionary *dic1 = @{@"key10":@"value10"};
[dic setDictionary:dic1];

11、字典遍历

  • for 循环

    	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
    
    	for (int i = 0; i < [dic count]; i++) {
    
    	    NSLog(@"%@ = %@", [[dic allKeys] objectAtIndex:i], [dic objectForKey:[[dic allKeys] objectAtIndex:i]]);
    }
  • for...in 循环

    	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
    
    	// 遍历所取出的为 key
    for(id key in dic){ NSLog(@"%@ = %@", key, [dic objectForKey:key]);
    }
  • Block 遍历

    	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
    
    	[dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
    
    	    NSLog(@"%@ = %@", key, obj);
    }];
  • 迭代器遍历

    	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
    
    	// key 迭代器
    NSEnumerator *keyEnumer = [dic keyEnumerator]; id key = nil;
    while (key = [keyEnumer nextObject]) {
    NSLog(@"%@ = %@", key, [dic objectForKey:key]);
    } // 对象迭代器
    NSEnumerator *objEnumer = [dic objectEnumerator]; id obj = nil;
    while (obj = [objEnumer nextObject]) {
    NSLog(@"%@", obj);
    }

12、字典排序

  • 用指定的方法排序

    	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2",
    @"value3", @"key3", @"value4", @"key4", nil]; // 先对 key 进行排序,再遍历数组
    id keys1 = [dic keysSortedByValueUsingSelector:@selector(compare:)]; for (id key in keys1) {
    NSLog(@"%@ = %@", key, dic[key]);
    }
  • 用 Block 排序

    	NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2",
    @"value3", @"key3", @"value4", @"key4", nil]; id keys2 = [dic keysSortedByValueUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
    return [obj1 compare:obj2];
    }]; for (id key in keys2) {
    NSLog(@"%@ = %@", key, dic[key]);
    }

iOS - OC NSDictionary 字典的更多相关文章

  1. NSDictionary字典创建,获取,遍历,可变字典的删除 - iOS

    字典是以键值对的形式来存储数据 key value 1 NSDictionary 字典 1.1 创建字典,不可变的 NSDictionary * dic = [NSDictionary diction ...

  2. OC NSDictionary

    OC NSDictionary NSDictionary初始化 NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@ ...

  3. [BS-02] iOS数组、字典、NSNumber 新写法—— @[]、@{}

    IOS数组.字典.NSNumber 新写法—— @[].@{}   //标准写法 NSNumber * number = [NSNumber numberWithInt:]; NSArray * ar ...

  4. ios+oc面试题

    ios+oc面试题     浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...

  5. iOS 文字属性字典

    iOS开发过程中相信大家常常遇到当须要给字体,颜色,下划线等属性的时候參数是一个NSDictionary 字典 可是字典里面究竟有哪些键值对了 我们把经常使用的总结一下 首先我们创建一个最简单的.设置 ...

  6. iOS常用 --- NSDictionary 与 NSMutableDictionary

    一.NSDictionary 字典的两种创建方法 NSDictionary *dic1 =[[NSDictionary alloc]init]; 2 // 或: 3 NSDictionary *dic ...

  7. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  8. iOS OC语言原生开发的IM模块--RChat

    iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...

  9. IOS Intro - NSDictionary and NSMutableDictionary

    NSDictionary.NSMutableDictionary的基本用法 1.不可变词典NSDictionary 字典初始化 NSNumber *numObj = [NSNumber numberW ...

随机推荐

  1. Akka.NET

    https://github.com/akkadotnet Akka是什么? 可扩展的分布式实时事务处理 编写正确的并发,容错和可扩展的应用程序是太难了.大多数时候,这是因为我们使用了错误的工具和错误 ...

  2. React-Native入门指导之iOS篇

    React-Native 入门指导系列教程目录 一.准备工作 (已完成) 二.项目介绍与调试 三.CSS样式与Flex布局 四.常用UI控件的使用 五.JSX在React-Native中的应用 六.事 ...

  3. Mysql slow query log

    一.概念部分:  顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slow query,通过设--log-slow-queries[=file_name]来打开该功能并设置记录 ...

  4. HDU 5787:K-wolf Number(数位DP)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5787 题意:要求相邻的K个位的数不能相同,在[L,R]区间有多少个这样的数. #inclu ...

  5. [HTML]background-size可以缩放大小

    转自:http://www.igooda.cn/jsdt/20130827355.html background-size需要两个值,它的类型可以是像素(px).百分比(%)或是auto,还可以是co ...

  6. Android关机闹钟实现

    Android关机闹钟实现 时间转换网站:http://tool.chinaz.com/Tools/unixtime.aspx 1.apk层 这个还是比较简单的,百度一下就可以看到apk的代码,我之前 ...

  7. [转]android使用shape stroke描边只保留底部

    在项目中遇到这种情况:由于一些原因,自己需要用LinearLayout的垂直布局做出ListView的那种效果,但是ListView是自带了分割线的,而且顶部底部都是没有分割线的,每个item中间都是 ...

  8. http://www.bejson.com/go.html?u=http://www.bejson.com/demo2.html

    json 解析工具http://www.bejson.com/go.html?u=http://www.bejson.com/demo2.html

  9. Session机制(是对cookie的作用的提升,使用较多)

    1.Session作用类似于购物车,第一次,放入物品,可以获得Session的id,并可以设置id失效的时间,这样便于多次将物品放在购物车里面,使用的就是获取的Session的id: 2.Sessio ...

  10. EasyUI的DataGrid 打印导出

    EasyUI的DataGrid 打印导出   一直在Winform和WPF的项目,偶尔接触Web都是网上下个模板修修改改就成了,学习的不太深入. 今日遇到一个打印导出datagrid的问题,做桌面项目 ...