您的位置:首页 > 其它

谓词predicate

2013-11-10 14:18 302 查看
1、在Objective-C谓词就是用于计算真值和假值的对象,其主要的优势就是可以通过传递谓词对象来共享查询条件
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);

        }

5、 这里需要注意,%@没有被引号括起来如:'%@',如果括起来的话,%@就相当于字符串了, 而不是格式化符号。
    NSString *strName = @"GongWen";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",strName];
6、 %K指的是key-path 这里的%K 是大写

NSString *key = @"name";

    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

     */

   //在谓词里可以使用如下的逻辑运算符

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中的与{}中字符串相符的那一条数据

12、如何来实用环境变量,创建谓词

    /*
$NAME 是随便给的 name 是看查找的需要可以是age $NAME是不需要改的
若改为age 则@"MengYao"要改为@20 其他则不需要改

     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);

其实结果是一样的只不过将不可变数组变为可变数组

  

/--------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  谓词