Cocoa Predicates类
predicate,论断,一种逻辑表达。论断一个事件成立。可以用在很多地方,比如作为数组的过滤器等等。(边看文档边写)
1. 论断的用途(几个常用的)
- 判断论断是否成立,成立的话返回真,否则返回假
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", @[@"Stig", @"Shaffiq", @"Chris"]];//暂时不用理解表达式的意思,反正这是一个论断
BOOL result = [predicate evaluateWithObject:@"Shaffiq"];//判断论断是否成立
- 论断和数组一起使用
作为过滤的条件来使用,产生一个新的数组。
NSMutableArray *array =
[NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];//一个可变数组
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'a'"];//一个论断,表示一定以字符a开头
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];//过滤得到的新数组中只含一个对象@"Adam"了
- 和key-Path一起使用
直接看例子:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"department.name like %@", departmentName];
可以看到,在表达式里可以直接用路径department.name,就表示department.name对象,而不用像NSString一样,每个对象都需要用%@表示,然后在后面填写参数。
再看:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"ANY employees.firstName like 'Matthew'"];
这个论断表示employees数组中至少有个对象的firstName属性是Mattew。
- 和NSFetchRequest一起用
用法和数组的过滤条件一样,数据提取出来也是以一个数组的形式返回。整个过程涉及到NSFetchRequest、NSEntityDescription、NSError。详细用法这里不介绍。总之论断是作为NSFetchRequest的条件。 - 和正则表达式一起使用
MATCHES操作符需要使用正则表达式,在下面会说到。
NSPredicate *catPredicate =
[NSPredicate predicateWithFormat:@"SELF MATCHES '.*(CAT){3,}(?!CA).*' ""];//这里最后多了一个双引号请忽略,加它只是为了让编辑器正确显示代码的颜色
NSArray *filteredArray = [array filteredArrayUsingPredicate:catPredicate];
2. 创建论断
创建一个论断,需要有论断表达式。
- 可以用格式化字符串来表示这个表达式。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"format",parameter1,parameter2,...];
这个格式化字符串可以是字符串常量、字符串变量、可以包含通配符,包含布尔值,包含对象。具体语法见下一节。
3. 论断表达式语法
基本格式
- 变量用$表示,如$VARIABLE_NAME
- 平时用于string的格式也可以用
- %@,代表对象
- %k,表示keyPath
比较
- !=和<>都表示不等于
- BETWEEN是否介于两者之间
格式BETWEEN{ $Lower,$UPPER}
如1 BETWEEN { 0 , 33 }
NSPredicate *betweenPredicate =
[NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];
布尔值论断
- TRUEPREDICATE一直为真的论断
- FALSEPREDICATE一直为假的论断
复合论断(用于连接两个或以上论断)
AND,&&,OR,||,NOT,! 都可以用
字符串比较相关的论断
- BEGINSWITH 左边的表达式以右边的表达式开头
- CONTAINS 左边的表达式包含右边右边的表达式
- ENDSWITH 左边的表达式以右边的表达式结尾
- LIKE 左边的表达式等于右边的表达式(表达式中可以使用通配符?和*,?可以替代一个字符,*可以替代0个或多个字符)
- MATCHES 左边的表达式等于右边的表达式,右边表达式用正则表达式(正则表达式看下一节)
- UTI-CONFORMS-TO 左边的UTI是否承认右边的UTI
- UTI-EQUALS 左边和右边的UTI相等
对集合的论断
- ANY,SOME,ALL,NONE 语义和字面意思一样,比如:
ANY children.age < 18
表示至少有一个children对象的age属性都小于18
ALL children.age < 14
表示所有children对象的age属性都小于18 - IN 表示在某个范围内,如:
name IN {'Ben','PanPan','OhYeah'}
再如:
NSPredicate *inPredicate =
[NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];
- array[index],array[FIRST],array[LAST],array[SIZE] 断定某个元素是数组中的第几个元素
标识
- #symbol 将一个系统保留的关键字symbol转换成普通的用户标识
- 斜杠\后跟不同个数字表示不同的数,如:
\456、\x85、\u1234分别表示八进制0456,十六进制0x85,Unicode数0x1234
上面的x和u大小写都可以
可用于论断表达式的一些表达
- SELF 表示要进行论断的那个对象
- FALSE、NO、TRUE、YES 逻辑假 逻辑真
- NULL、NIL 表示是个空值
- “text”或’text’ 表示是字符串
- 逗号隔开的数组
- 标准整型数和定点数
- 浮点数
- 0x 十六进制数前缀
- 0o 八进制数前缀
- 0b 二进制数前缀
4. 正则表达式(基本的)
参考这个网站
http://userguide.icu-project.org/strings/regexp
- 集合的表达
表格 |
---|
方括号[ ]表示集合,也可以理解为范围,在方括号中指明范围。 |
[abc]表示abc中的一个 |
^符号是除了的意思如,[^abc],表示范围是除了a,b,c以外的所有字符 |
-符号表示到、至的意思,如[a-c],表示a到c;再如[\u0000-\uffff],表示unicode编码的所有字符 |
\p{certainCategory} 表示Unicode类别为certainCategory的字符,比如:[\p{Letter}]表示的范围为属于Unicode编码的Letter类中的所有字符 |
\P{certainCategory} 表示除了Unicode类别为certainCategory以外的字符 |
&&和–分别是取交集和取减集 |
方括号[ ]的嵌套使用,表示并集,如:[[a-z][A-Z][0-9]],也可以不加括号直接写成[a-zA-Z0-9] |
- 操作符
表格 |
---|
| 表示或 |
* 表示需要匹配一个字符 |
+ 表示需要匹配一次或以上 |
? 表示需要匹配0个或一个字符 |
{n} 表示需要匹配n个字符 |
{n,} 表示需啊哟匹配至少n个字符 |
{n,m} 表示需要匹配不少于n个、不多于m个字符 |
以上2到7行的操作符后加问号? 表示reluctant勉强的(如{n,m}?),在后面加加号+表示possessive独占的,或者刚好的(如{n,}+)。如果不加任何东西保持原样,表示greedy,贪婪的。具体这三种状态的区别,见这里。在正则表达式的文档中建议使用独占的,意义比较明确,降低发生错误的可能。 |
- 具有特定意义的字符
字符 | 描述 | 使用范围是在方括号[ ]内,还是外 |
---|---|---|
. | 匹配任意字符。 | 外 |
\ | 将紧跟其后的字符(可能原本是系统保留的操作符)变为普通字符。必须使用\的字符有* ?+ [ ( ) { } ^ $ | \ . 。 | 内 |
\ | 将紧跟其后的字符(可能原本是系统保留的操作符)变为普通字符。必须使用的\的字符有[ ] \ 。 | 外 |
^ | 表示从第一个字符开始就要与格式匹配(不要与集合[ ]里面的用法混淆)。 | 外 |
$ | 表示结尾要和格式匹配 | 外 |
\d | 表示十进制数 | both |
\D | 表示除十进制数以外的字符 | both |
\uhhhh | 表示4位十六进制数值 | both |
\Uhhhhhhhh | 表示8位的十六进制数 | both |
\x{hhhh} | 表示1到6位的十六进制数 | both |
\xhh | 表示2位十六进制数 | both |
\0ooo | 表示1到3位的八进制数,如0123,0是必须的 | bot |
\s | 表示空格字符 | both |
\S | 表示非空格字符 | both |
还有很多。。。今天先不写了。。