您的位置:首页 > 其它

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
还有很多。。。今天先不写了。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: