Cocoa Predicates Classes
2016-03-22 21:51
381 查看
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 |
相关文章推荐
- linux命令介绍(5)
- 基本标签(二)
- DFS+打表
- OC-如何隐藏NSLog打印的自带信息
- volatile解析(转)
- php的一些小笔记--数组
- Spring配置概述
- 如何加快HTML页面加载速度
- AsyncTask 和 handler的介绍
- ACM第一次练习—1001B,1008I
- C# 读写App.config配置文件的方法
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- ReadWriteLock使用
- R语言实战k-means聚类和关联规则算法
- 新版XCode7.2.1的Instruments测试内存泄露
- Mysql在大型网站的应用架构演变
- 递归计算阶乘
- 大家一起和snailren学java-(四)初始化与清理
- poj Big Number 1423 (数学 取对数&技巧)
- opencv的学习——入门