• NSDictionary , NSMutableDictionary, NSMutableDictionary 和 NSMutableSet)相当于java的map、set


    1 NSDictionary 和 NSMutableDictionary 

    NSDictionary  :就是java中的map; 放入对象是键值对 key-value  , 同样 秉持了一样的原则,只能放入对象,不可本体增删改;

    (1)初始化方法

    • + dictionaryWithObject:forKey:
    • + dictionaryWithObjects:forKeys:
    • + dictionaryWithObjectsAndKeys:

    这三个是最常用的吧,注意是对象在前,key在后

    2 访问 key和value

    Accessing Keys and Values

    • – allKeys
    • – allKeysForObject:
    • – allValues
    • – objectForKey:

    allKeys返回所有的key,  allValues返回所有的value

    • – allKeysForObject:
    • NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"man1",@"11",@"wom",@"22",@"kid",@"33",@"man1",@"44",nil];
              NSArray *array = [dic2 allKeysForObject:@"man1"];
              NSLog(@"%@",array);
      由上代码可知,allKeysForObject是返回指定对象中所有这个和这个对象配对的key(一个字典或者是java中的map key是唯一的 可是value却不是). 

       

       

          3 枚举字典

             Enumerating Dictionaries

      • – keyEnumerator
      • – objectEnumerator
      • – enumerateKeysAndObjectsUsingBlock:
      • enumerateKeysAndObjectsWithOptions:usingBlock:

        以上几种的方法主要都是获取这个字典里的值,相当于for吧 不过比for效率高,毕竟官方封装的方法
      NSDictionary *nsd = [NSDictionary dictionaryWithObjectsAndKeys:@"萌妹子",@"1",@"御姐",@"2",@"女汉子",@"3", nil];
          [nsd enumerateKeysAndObjectsWithOptions:NSEnumerationReverse usingBlock:^(id key, id obj, BOOL *stop) {
              NSLog(@"%@ - %@" ,key,obj);
          }];
      NSEnumerator *en = [nsd keyEnumerator];
          id string;
          while (string = [en nextObject]) {
              NSLog(@"%@-%@",string,[nsd objectForKey:string]);
          }

      先说 – keyEnumerator – objectEnumerator 这是获取字典中的全部的key 或者 object 注意他们是  NSEnumerator 类型的

      这个类型只有一个方法 nextObject 它我觉得就是把对象按链表的方式存起来 让你一个个读.

       

       

      • – enumerateKeysAndObjectsUsingBlock:
      • enumerateKeysAndObjectsWithOptions:usingBlock:

        然后就是这两个 它俩其实一样 只不过第二个比第一个少一个参数

        NSSortOptions 这是个枚举值 ,它的作用是设定取KEY的顺序 (NSSortConcurrent 是正序 ,NSSortStable 反序)

         

        enum {

           NSSortConcurrent = (1UL << 0),

           NSSortStable = (1UL << 4),

        };

       

      (这儿有了个疑问,字典存放不是无序的么 怎么还分正反,后来想了想,可能是为了在同一个方法或者这个字典的生命周期里确定吧,

      毕竟这个字典创建后,那些键值对还是按照某个顺序存在的);

      NSMutableDictionary

      同样 这是一个可变的字典 那么它就和java中的map基本相同了 

      Creating and Initializing a Mutable Dictionary

      • + dictionaryWithCapacity:
      • – initWithCapacity:
      • + dictionaryWithSharedKeySet:

      Adding Entries to a Mutable Dictionary

      • – setObject:forKey:
      • – setObject:forKeyedSubscript:
      • – setValue:forKey:
      • – addEntriesFromDictionary:
      • – setDictionary:

      Removing Entries From a Mutable Dictionary

      • – removeObjectForKey:
      • – removeAllObjects
      • – removeObjectsForKeys:

      上面的几个方法都没什么好说的,不得不说苹果的命名机制很好,见名知意. 

       

      2  NSSet  和 NSMutableSet

      NSSet 就是一个只能存放唯一值的集合,不知道OC中是在呢么实现的,java是判断hash码,我估计oc也差不多.

      它一样的创建后 无法改变

       

      • – allObjects
      • – anyObject
      • – containsObject:
      这几个是获取里面的对象的 第一个是获取全部的,第二个是获取一个随机的(说是随机 其实就是第一个,

       

      不过set是随机存储,那么也可以理解为随机了,可是同一个生命周期内取到的都是同一个值)

      见代码!

        NSSet *set = [NSSet setWithObjects:@"123",@"456",@"789", nil];
              NSArray *ns = [set allObjects];
              id na = [set anyObject];
              BOOL  a = [set containsObject:@"123"];
              NSLog(@"%@,%@,%d",ns,na,a);

       

      输出是2013-08-08 20:45:01.846 NSSetAndNSDic[1886:303] ( 
      123, 
      456, 
      789 
      ),123,1

      想判断是否包含某个对象还有一个方法

       

      – member:

       

       

      NSString *b = [set member:@"456"];
              NSLog(@"%@",b);
      这就是我觉得比较重要的几个 剩下的见名知意 

       

      NSMutableSet

       
      • – unionSet:
      • – minusSet:
      第一个是将两个set融合 ,第二个是删除两个集合中相同的 
      NSMutableSet *set = [NSMutableSet setWithObjects:@"123",@"456",@"789", nil];
              NSMutableSet *set2 = [NSMutableSet setWithObjects:@"abc",@"def",@"hij", nil];
              NSMutableSet *set3 = [NSMutableSet setWithObjects:@"hjk",@"789", nil];
              [set unionSet:set2];
              NSLog(@"%@",set);
              [set minusSet:set2];
               NSLog(@"%@",set);
              [set minusSet:set3];
                 NSLog(@"%@",set);
      输出:
      2013-08-08 21:00:59.885 NSSetAndNSDic[1920:303] {( 
      123, 
      789, 
      abc, 
      hij, 
      456, 
      def 
      )} 
      2013-08-08 21:00:59.887 NSSetAndNSDic[1920:303] {( 
      123, 
      789, 
      456 
      )} 
      2013-08-08 21:00:59.887 NSSetAndNSDic[1920:303] {( 
      123, 
      456 
      )} 

      补充:

      还有一个for in的用法,我觉得就是java中的超强循环 for each 一个样
      只要是 array set Dictionary 都能用
      NSDictionary *nsd2 = [NSDictionary dictionaryWithObjectsAndKeys:@"萌妹子",@"1",@"御姐",@"2",@"女汉子",@"3", nil];
      
              for (id key in nsd2) {
                  NSLog(@"%@",[nsd objectForKey:key]);
              }
      没什么好说的,知道有这个简便用法,和for一样
  • 相关阅读:
    信号
    序列化数据的两种方式
    ModelForm的使用
    分页模板
    Django中间件进行用户登陆验证
    Flask 笔记一
    pipenv 使用基本命令
    git本地文件 上传 远程仓库
    service "$service" status 返回的状态
    &>/dev/null 的作用
  • 原文地址:https://www.cnblogs.com/langtianya/p/3891251.html
Copyright © 2020-2023  润新知