iOS - OC NSDictionary 字典

简介: 前言 @interface NSDictionary : NSObject @interface NSMutableDictionary : NSDictionary字典只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil 。

前言

    @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]);
        }
目录
相关文章
|
8月前
|
Swift iOS开发
iOS OC混编Swift 后者无法走断点
iOS OC混编Swift 后者无法走断点
50 0
|
存储 Unix 编译器
|
存储 算法 iOS开发
|
Swift iOS开发 容器
iOS 仿支付宝银行卡界面(支持Swift/OC)
在有支付相关的APP中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。
328 0
|
编解码 Swift iOS开发
iOS 应用之间的跳转(OC&Swift)
iOS 应用之间的跳转(OC&Swift)
808 0
iOS 应用之间的跳转(OC&Swift)
|
开发工具 Swift iOS开发
iOS 问题 1: OC项目导入swift三方库不兼容问题
iOS 问题 1: OC项目导入swift三方库不兼容问题
887 0
iOS 问题 1: OC项目导入swift三方库不兼容问题
|
iOS开发
iOS逆向 04:OC反汇编(下)
iOS逆向 04:OC反汇编(下)
227 0
iOS逆向 04:OC反汇编(下)
|
编译器 iOS开发
iOS逆向 04:OC反汇编(上)
iOS逆向 04:OC反汇编(上)
156 0
iOS逆向 04:OC反汇编(上)
|
存储 缓存 编译器
iOS-底层原理 20:OC底层面试解析
iOS-底层原理 20:OC底层面试解析
415 0
iOS-底层原理 20:OC底层面试解析
|
编译器 API iOS开发
iOS/OC Rumtime 相关API
iOS/OC Rumtime 相关API
87 0
iOS/OC Rumtime 相关API