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:可以在创建谓词时动态传入一个属性名。
$参数名 ,通过这个东西,可以让一个谓词模板变化出多个谓词对象。