Object-C基础(13)——字典与谓词

来源:互联网 发布:金字塔 插件编程 编辑:程序博客网 时间:2024/06/05 15:26

NSDictionary与NSMutableDictionary(字典)

      它包含的元素不是单个元素,它的元素总是key-value成对出现。

      对于NSDictionary而言,它的key是不允许重复的,但value则可以重复。而且程序可以根据key来查找NSDictionary中的value。

      包括的它的count值,都是按“key-value对”来算。

      NSDictionary的key是无序的,程序无法保证key的添加顺序。

      创建NSDictionary

       - 用初始化方法或者类方法来创建NSDictionary。

       - 简化语法。

      判断NSDictionary的元素:

         - count

         - allKeys:获取所有key组成NSArray

         - - (NSArray*)allKeysForObject:(id)anObject:获取某个value对应的所有的key。

         - 最常用:就是根据key,获取value。支持使用下标语法。

      遍历字典:

        -(void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts

                               usingBlock:(void (^)(id key,

                                                     id obj,

                                                    BOOL *stop))block :用代码块遍历

        - keyEnumerator:获取所有key组成的NSEnumerator。

        - objectEnumerator:获取所有的value组成的NSEnumerator。

          NSEnumerator可用于遍历。

      排序(排序结果是返回所有key按顺序排列后的NSArray- 用value对key排序)

        - (NSArray*)keysSortedByValueUsingSelector:(SEL)comparator:用value的指定方法对key进行排序。

        - (NSArray*)keysSortedByValueWithOptions:(NSSortOptions)opts

          usingComparator:(NSComparator)cmptr   用代码块根据value对key进行排序。

      过滤(返回符合条件的key所组成NSSet)

          - (NSSet*)keysOfEntriesWithOptions:(NSEnumerationOptions)opts

                        passingTest:(BOOL(^)(id key,

                                             id obj,

                                             BOOL *stop))predicate

      NSMutableDictionary,可变版本

          此处的可变体现为:程序可以添加、删除、替换它的key-value对

         - (void)setObject:(id)anObjectforKey:(id<NSCopying>)aKey: 添加或替换。

         - (void)setObject:(id)objectforKeyedSubscript:(id<NSCopying>)aKey:支持下标行为。

         -(void)addEntriesFromDictionary:(NSDictionary *)otherDictionary:批量添加多个key-value对。

           如果key重复,就会发生替换。

         - (void)removeObjectForKey:(id)aKey:根据key来删除对应的key-value对。

         - (void)removeObjectsForKeys:(NSArray*)keyArray:同时删除多个key-value对。

         - (void)removeAllObjects 删除所有。

      自定义类作为NSDictionary的key。(高级知识)

           如果自定义类作为NSDictionary的value,那没有任何需要特别注意的地方。

           自定义类要作为NSDictionary的key时,必须满足如下要求:

            - 该类必须遵守NSCopying协议,也必须实现该协议中的copyWithZone:方法。

            - 必须正确地重写isEqual:和hash两个方法。

              只要两个key通过isEqual:比较返回YES,且hash方法返回值也相等,NSDictionary就会认为这两个key是重复的。

           结论:当程序把对象作为NSDictionary的key存入时,实际上NSDictionary并未真正存入该key,

                会先将该key会被复制一份副本,实际存入NSDictionary的只是它的副本。

谓词(NSPredicate)

       所谓谓词,其实就代表了一个条件,程序就可以根据谓词来进行数据过滤(检索)。

       (1)使用类方法创建一个NSPredicate。

       (2)直接把NSPredicate传给其他方法(因为有些方法本身就需要NSPredicate作为参数)

            或者evaluateWithObject:、evaluateWithObject:substitutionVariables: 来计算谓词的结果。

           实际上,就是验证传给evaluateWithObject:的对象是否满足谓词的条件。

        谓词过滤集合:

        - (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate

        -(void)filterUsingPredicate:(NSPredicate *)predicate

        -(NSSet *)filteredSetUsingPredicate:(NSPredicate *)predicate

        - (void)filterUsingPredicate:(NSPredicate*)predicate

        谓词的本质: 条件表达式。

            谓词到底可用哪些运算符?

            - 各种比较运算符。包括  BETWEEN {下限, 上限}

            - 逻辑运算符。 AND  OR  NOT

            - 字符串运算符 BEGINSWITH、CONSTAINS、ENDSWITH、LIKE(可以支持?、*),MATCHES(支持正则表达式)

            - 集合运算符:ANY、SOME、ALL、NONE、IN、对于数组,可以直接用array[index],array[FIRST]、array[LAST]、array[SIZE]

       带参数的谓词

           %@、%g、%d、%lu……:类似输出变量时所用的格式字符串。当谓词条件中存在某个变量时,就可通过这种形式的占位符来“插入”变量的值。

           %K:可以在创建谓词时动态传入一个属性名。

           $参数名 ,通过这个东西,可以让一个谓词模板变化出多个谓词对象。

            

1 0
原创粉丝点击