谓词predicate

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);
其实结果是一样的只不过将不可变数组变为可变数组
  
/--------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值