IOS学习笔记之谓词

1、定义谓词

     NSPredicate(谓词),用于定义一个逻辑条件,通过该条件可执行搜索或过滤操作。

    谓词由NSPredicate对象来代表,创建一个NSPredicate对象使用NSPredicate的predicateWithFormat:方法;   

Student *stu  = [[Studentalloc] initWithStuName:@"张三"stuAge:16stuSex:1];

        //定义谓词

        NSPredicate *pre1 = [NSPredicatepredicateWithFormat:@"stuAge > 18"];

  创建谓词之后,即可使用NSPredicate的evaluateWithObject:方法执行判断:

        //使用谓词执行判断

        BOOL result = [pre1 evaluateWithObject:stu];

        if (result) {

            NSLog(@"大于18");

        }

        else

            NSLog(@"未成年");

       

2、判断对象本身

   如果要对对象本身就需要使用SELF

        NSString *testStr = @"李良成";

        //判断是否包含良

        NSPredicate *pre5 = [NSPredicatepredicateWithFormat:@"SELF LIKE '**'"];

        if([pre5 evaluateWithObject:testStr]){

            NSLog(@"包含\"\"");

        }else{

            NSLog(@"不包含\"\"");

        }

3、使用谓词过滤集合(数组)

   谓词的一个常用功能就是对集合进行过滤,当程序使用谓词对集合元素进行过滤时,程序会自动遍历集合元素,并根据集合元素来计算谓词的值,只有当根据某个元素计算谓词并返回YES时,该集合元素才会被保留下来。

  NSArray 提供了如下方法使用谓词过滤数组

  -(NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定谓词过滤NSArray数组,返回数组中符合谓词条件的元素组成新的数组

  NSSet提供了如下方法使用谓词来过滤集合:

  -(NSSet *)filteredSetUsingPredicate:(NSPredicate *)predicate:使用指定谓词过滤集合,返回该集合中符合谓词条件的元素组成新的集合 

        Student *stu1  = [[Studentalloc] initWithStuName:@"张三"stuAge:16stuSex:1];

        Student *stu2  = [[Studentalloc] initWithStuName:@"李四"stuAge:19stuSex:0];

        Student *stu3  = [[Studentalloc] initWithStuName:@"王五"stuAge:15stuSex:1];

        Student *stu4  = [[Studentalloc] initWithStuName:@"赵六"stuAge:20stuSex:0];

        NSArray *array = @[stu1,stu2,stu3,stu4];

        NSPredicate *pre6 = [NSPredicatepredicateWithFormat:@"stuAge>18"];

        NSArray *fliterArray = [array filteredArrayUsingPredicate:pre6];

        NSLog(@"大于18的人有:%@",fliterArray);

       

4、使用谓词过滤可变集合(数组)

   NSMutableArray提供了如下方法使用谓词来过滤数组:

   -(void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的谓词过滤NSMutableArray数组,删除该数组中不符合条件的元素

   NSMutableSet提供了如下方法使用谓词来过滤集合:

   -(void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的谓词过滤NSMutableSet集合,删除该集合中不符合条件的元素

        //使用谓词过滤可变集合

        NSMutableArray *muArr = [NSMutableArrayarray];

        NSMutableSet *muSet = [NSMutableSetset];

        for (int i =0; i < 10; i++) {

            NSString *nameStr = @"";

            if (i > 5) {

                nameStr = [NSString stringWithFormat:@"lisi%i",i];

            }else{

                nameStr = [NSString stringWithFormat:@"zhangsan%i",i];

            }

            [muArr addObject:nameStr];

            [muSet addObject:nameStr];

        }

       //创建谓词,模糊查找自身对象是否包含'zhangsan'

        NSPredicate *pre7 = [NSPredicatepredicateWithFormat:@"SELF like '*zhangsan*'"];

        [muArr filterUsingPredicate:pre7];

        NSLog(@"%@",muArr);

        [muSet filterUsingPredicate:pre7];

        NSLog(@"%@",muSet);

        

5、在谓词中使用格式化符

   如果需要在谓词表达式中使用变量,则可以考虑在谓词中使用格式化参数。在谓词中支持一下两个格式化符:

   %k,该格式化符用于动态传入属性名

   %@,该格式化符用于动态设置属性值

   Person *person = [[Person alloc] initWithData:@"zhangsan" aAge:16 aEmail:@"1111@q.com"];

  person.score = 50.5f;

  //创建谓词,要求年龄大于等于18岁

  NSPredicate *preAge = [NSPredicate predicateWithFormat:@"age>=%@",@18];

  if([preAge evaluateWithObject:person]){

     NSLog(@"成年");

  }else{

    NSLog(@"未成年");

  }

  //创建谓词,要求分数大于等于60分

  //@"%K>=%@",score作为%K的值,@60.0作为%@的值

  //%K,K一定要大写

  NSString *score = @"score";

  NSPredicate *preScore = [NSPredicate predicateWithFormat:@"%K>=%@",score,@60.0f];

  

if([preScore evaluateWithObject:person]){

     NSLog(@"及格");

  }else{

    NSLog(@"不及格");

  }

6、谓词表达式语法

  谓词表达式由表达式、运算符和值组成

  =、==:判断是否等于某个值

  >=、=>:判断是否大于等于某个值

  <=、=<:判断是否小于等于某个值

  >:判断是否大于某个值

  <:判断是否小于某个值

  !=、<>:判断不等于某个值

  BETWEEN:BETWEEN表达式必须满足"表达式 BETWEEN{上限,下限}"的格式,判断某个值是否在这个区间

  AND 、&&:逻辑与,要求两个表达式的值都为YES时,结果才为YES

  OR、||:逻辑或,要求任何一个表达式的值为YES时,结果才为YES

  NOT、!:逻辑非,用于对原有表达式的结果取反

  BEGINSWITH:检查某个字符串是否以指定的子串开头

  NEDSWITH:检查某个字符串是否以指定的子串结尾

  CONTAINS:检查某个字符串是否包含指定的子串

  LIKE:相当于模糊查询某个字符串,LIKE后面可使用字符串模板,该字符串模板允许使用*和?两个通配符,其中*代表任意多个字符,?代表一个字符

  MATCHES:检查某个字符串是否匹配指定的正则表达式,虽然正则表达式的功能是强大,但是执行效率是最低的。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值