OC 第7天(NSDictionary , NSMutableDictionary, NSMutableDictionary 和 NSMutableSet)

今天是OC学习的第七天 OMG 老师说讲完了......好吧,其实是开始讲UI了,然后到哪个地方用到OC中未学的地方时,再带着讲.没办法,好的学习是跟着老师走.

今天讲得时OC中collection的后两个对象NSDictionary  NSSet  以及引申出得 NSMutableDictionary 和 NSMutableSet 

  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

          这货是NSSet的子类 当然它和java的set就很相似了
        • – 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一样

        总结:

        好吧 ,oc感觉刚接触就没了,一星期就这么结束了,不过还好,面向对象语言都类似,不过写代码的时候发现自己总是按面向过程的C来写,这个......
        那么就准明天的UI吧.(再一次感叹苹果的命名规则,太规范方便了)




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

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

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值