iOS - OC NSDictionary 字典
前言
@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 字典的更多相关文章
- NSDictionary字典创建,获取,遍历,可变字典的删除 - iOS
字典是以键值对的形式来存储数据 key value 1 NSDictionary 字典 1.1 创建字典,不可变的 NSDictionary * dic = [NSDictionary diction ...
- OC NSDictionary
OC NSDictionary NSDictionary初始化 NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@ ...
- [BS-02] iOS数组、字典、NSNumber 新写法—— @[]、@{}
IOS数组.字典.NSNumber 新写法—— @[].@{} //标准写法 NSNumber * number = [NSNumber numberWithInt:]; NSArray * ar ...
- ios+oc面试题
ios+oc面试题 浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...
- iOS 文字属性字典
iOS开发过程中相信大家常常遇到当须要给字体,颜色,下划线等属性的时候參数是一个NSDictionary 字典 可是字典里面究竟有哪些键值对了 我们把经常使用的总结一下 首先我们创建一个最简单的.设置 ...
- iOS常用 --- NSDictionary 与 NSMutableDictionary
一.NSDictionary 字典的两种创建方法 NSDictionary *dic1 =[[NSDictionary alloc]init]; 2 // 或: 3 NSDictionary *dic ...
- iOS - OC 面向对象语法
1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...
- iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...
- IOS Intro - NSDictionary and NSMutableDictionary
NSDictionary.NSMutableDictionary的基本用法 1.不可变词典NSDictionary 字典初始化 NSNumber *numObj = [NSNumber numberW ...
随机推荐
- java map 遍历
转自http://rain-2372.iteye.com/blog/1615615 package com.spring.test_B11_aop1; import java.util.HashMap ...
- linux下echo命令详解(转)
linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法 echo命令的功能是在显示器上显示一段文字,一般起到一个 ...
- ecshop添加商品选择品牌时如何按拼音排序
ECSHOP后台添加新商品时,有一个选择品牌的下拉框,如果品牌太多,在下拉框里查找起来很不方便. 我想给“下拉框里的品牌列表”按品牌名的拼音排序,比如有“中国水利出版社” “中国人民出版社” 这两个品 ...
- C++11的一些新特性
3.1.9崭新的Template特性 Variadic Template 可变参数模板 void print() { } template <typename T, typename… Type ...
- ACM题目————食物链
题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...
- JavaScript navigator 对象(转)
navigator -- navigator对象通常用于检测浏览器与操作系统的版本 navigator,中文"导航器" 引用网址:http://www.dreamdu.com/ja ...
- oracle中的自动增长
create table test( id int not null primary key, name varchar2(20), sex int) ; create sequence t -> ...
- recv send 阻塞和非阻塞
http://blog.csdn.net/xiaofei0859/article/details/6037814 int send( SOCKET s, const char FAR *buf, in ...
- C++运算法优先级
- python学习笔记五 模块上(基础篇)
模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...