1
、在Objective-C谓词就是用于计算真值和假值的对象,其主要的优势就是可以通过传递谓词对象来共享查询条件
2 、 首先创建一个谓词对象,用于逻辑计算。这里的name是需要注意?它是PNStudent类里的成员属性,也叫key,或者广泛的说又叫keyPath
3 、 第二个需要注意的是, GongWen这个字符串需要用单引号括起来。==左边会被理解为key,右边理解会字符串,对于字符串必须 加上单引号
for (PNStudent *stu in students) {
if ([predicate evaluateWithObject:stu]) {
NSLog(@"%@",stu);
}
5
、 这里需要注意,%@没有被引号括起来如:'%@',如果括起来的话,%@就相当于字符串了, 而不是格式化符号。
NSString *strName = @"GongWen";
2 、 首先创建一个谓词对象,用于逻辑计算。这里的name是需要注意?它是PNStudent类里的成员属性,也叫key,或者广泛的说又叫keyPath
3 、 第二个需要注意的是, GongWen这个字符串需要用单引号括起来。==左边会被理解为key,右边理解会字符串,对于字符串必须 加上单引号
4
、 evaluateWithObject这个方法, 是根据谓词所表达的逻辑,来计算结果,它结果返回的是Bool值,如果与谓词逻辑一致,那么返回YES,否则返回NO
例:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];for (PNStudent *stu in students) {
if ([predicate evaluateWithObject:stu]) {
NSLog(@"%@",stu);
}
NSString *strName = @"GongWen";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",strName];
NSString *name = @"ZhenZhen";
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K == %@",key,name];
7
、谓词的运算符
>= and => <
<= and =< != and <>
Meaning
Greater than
Greater than or equal to Less than
Less than or equal to Not equal to
*/
9 、BETWEEN 大写和小写都是可以的
在这里结果是包含20和25的。 现在查询条件的功能是找出大于等于20并且小于等25的学生。
第一种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age BETWEEN {20,25}"];
NSArray *betweens = @[@20,@25];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SELF IN { 'ZhenZhen', 'GongWen', 'Zhangsan', 'LiSi' }"];
NSArray *results = [names filteredArrayUsingPredicate: predicate];
12、如何来实用环境变量,创建谓词
/*
$NAME 是随便给的 name 是看查找的需要可以是age $NAME是不需要改的
6
、 %K指的是key-path 这里的
%K
是大写
NSString *key = @"name";NSString *name = @"ZhenZhen";
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K == %@",key,name];
>= and => <
<= and =< != and <>
Meaning
Greater than
Greater than or equal to Less than
Less than or equal to Not equal to
*/
//在谓词里可以使用如下的逻辑运算符
AND, OR, and NOT logical operators, or their C-looking equivalents &&, ||, and !.
8
、// 凡是在代码里进行字符串比较的,都是按照字典顺序来进行比较, 所为的字典顺序就是指字母在字典里的排列顺序。
9 、BETWEEN 大写和小写都是可以的
在这里结果是包含20和25的。 现在查询条件的功能是找出大于等于20并且小于等25的学生。
第一种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age BETWEEN {20,25}"];
NSArray *betweens = @[@20,@25];
第二种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age between %@",betweens];
这里的大小写敏感
10
、 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name IN {'ZhenZhen','GongWen','tonghao','LiSi'}"];
这里是查找名字是{}中间相符的 中括号里的字符串大小写敏感;
11、
这里的SELF就表示谓词计算的对象是谁?在这里就是指的数组里的一个个NSString对象。这个例子主要理解什么是SELF就可以了。
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SELF IN { 'ZhenZhen', 'GongWen', 'Zhangsan', 'LiSi' }"];
NSArray *results = [names filteredArrayUsingPredicate: predicate];
SELF 指的是遍历的数组中的字符串 这里的是指查找
names中的与{}中字符串相符的那一条数据
/*
$NAME 是随便给的 name 是看查找的需要可以是age $NAME是不需要改的
若改为age 则
@"MengYao"要改为@20 其他则不需要改
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name = $NAME"];
NSDictionary *varDic = [NSDictionary
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name = $NAME"];
NSDictionary *varDic = [NSDictionary
dictionaryWithObjectsAndKeys:@"MengYao", @"NAME",nil];
NSPredicate *pre = [preTemplate predicateWithSubstitutionVariables:varDic];
NSArray *stus = [[classRoom allStudents] filteredArrayUsingPredicate:pre];
通过Foundation框架的关于数组过滤的方法,对比谓词在实际应用中的便利
/--------------------------
第一种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
NSArray *stus = [[classRoom allStudents] filteredArrayUsingPredicate:predicate];
NSLog(@"%@",stus);
/--------------------------
第二种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
NSLog(@"befor evaluate student's info is %@",students);
for (PNStudent *stu in students) {
if ([predicate evaluateWithObject:stu] ) {
NSLog(@"%@",stu)
/---------------------------
第三种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
NSMutableArray *nameCopy = [[classRoom allStudents] mutableCopy];
NSLog(@"befor filter nameCopy is:%@",nameCopy);
[nameCopy filterUsingPredicate:predicate];
NSLog(@"after filter nameCopy is %@",nameCopy);
其实结果是一样的只不过将不可变数组变为可变数组
NSPredicate *pre = [preTemplate predicateWithSubstitutionVariables:varDic];
NSArray *stus = [[classRoom allStudents] filteredArrayUsingPredicate:pre];
通过Foundation框架的关于数组过滤的方法,对比谓词在实际应用中的便利
/--------------------------
第一种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
NSArray *stus = [[classRoom allStudents] filteredArrayUsingPredicate:predicate];
NSLog(@"%@",stus);
/--------------------------
第二种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
NSLog(@"befor evaluate student's info is %@",students);
for (PNStudent *stu in students) {
if ([predicate evaluateWithObject:stu] ) {
NSLog(@"%@",stu)
这两种方法是一致的
*/---------------------------
第三种 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
NSMutableArray *nameCopy = [[classRoom allStudents] mutableCopy];
NSLog(@"befor filter nameCopy is:%@",nameCopy);
[nameCopy filterUsingPredicate:predicate];
NSLog(@"after filter nameCopy is %@",nameCopy);
其实结果是一样的只不过将不可变数组变为可变数组
/--------------------------