iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍

  • 1、遍历

遍历集合的方式由多种,如:for 循环、 for in 快速遍历、NSEnumerator 等。其中基于块(block)的遍历方式比较更加的实用,方便。
1.1经典for循环
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
该遍历使用广泛、操作简单。但对于字典(NSDictionary)、NSSet 的遍历就比较繁琐,
因为字典和 set 是无序的,所以无法根据特定的整数下标来直接访问其中的值,需要
先获取字典中的键或 set 中的所有对象,这样才可以在获取数组上进行遍历,这样会
造成系统额外的开销。
1.2 for in(NSFastEnumeration)快速遍历
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
快速遍历方法实用很简便,效率也很高,但是不能获取当前遍历的下标。
1.3基于快(block)的遍历
数组的遍历(可同时获取数组的元素及对应下标)
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
字典的块遍历(block直接把字典的key和value都返回来,不用再写其他繁琐的内容):
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
块的遍历可以完美的实现 for 循环的所有功能,可以方便的获取集合中的每一项元素。
提供了循环遍历的参数,NSEnumerationReverse 来实现倒序循环,NSEnumerationConcurrent 用来实现并发遍历。
当使用 NSEnumerationConcurrent 选项时,可以实现 for 循环和快速遍历无法轻易实现的并发循环功能,系统底层会通过 GCD 处理并发事宜,这样可以充分利用系统和硬件资源,达到最优的遍历效果。
遍历执行的 block 会分配在多核 CPU上执行,对于耗时的任务来说很值得这么做。重要的是,对于遍历的外部是保存同步的,即需要在 block 遍历都完成后才继续执行下一行

  • 2、数组内容的查找

相比于使用遍历查找需要的内容,使用 NSPredicate 进行条件查找,显得更加方便。
在 Cocoa 框架中 NSPredicate 用于查询,原理和用法都类似于 SQL 中的where。常用的
比较内容如下:
– 比较运算符 >, < == >=, !=, 还可以跟逻辑运算符一起使用: &&、||、AND、OR
eg: NSPredicate *predicate = [NSPredicate predicateWithFormat:@“age > 20”];
predicate = [NSPredicate predicateWithFormat:@“name > ‘abc’ && age > 10”];

– 范围运算符: IN、BETWEEN
eg: @“address IN {‘shanghai’, ‘beijing’}”

– 字符串本身: SELF 只针对字符数组起作用
eg: @“SELF == ‘APPLE’”

– 字符串相关: BEGINSWITH、ENDSWITH、CONTAINS
eg: @“name CONTAIN [cd] ’ang’” // 包含某个字符串
@“name BEGINSWITH [c] ‘sh’” // 以某个字符串开头
@“name ENDSWITH [d] ‘and’” // 以某个字符串结尾
注: [c] 不区分大小写
[d] 不区分发音符号,即没有重音符号
[cd] 即不区分大小写,也不区分发音符号

– 通配符:LIKE
eg: @“name LIKE [cd] ‘er’” // * 代表通配符
@“name LIKE [cd] ‘???er*’”

– 正则表达式:MATCHES
eg: NSString *regex = @”^A.+e$”; // 以 A 开头,e 结尾
@”name MATCHES %@”, regex

实际使用例子:
eg1: 查询数组中的字符串
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
eg2:查询数组中符合条件的模型对象
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
iOS 集合(NSArray、NSDictionary、NSSet)使用的一些方法介绍
其他情形,可按照给出的示例进行验证使用。

备注:本文整理于2016年11月(Q),现将本地文档网络化。