美文网首页
101-谓词

101-谓词

作者: AlanGe | 来源:发表于2017-08-16 00:46 被阅读4次

    谓词(am/is/are)---NSPredicate

    作用:判断条件表达式的求值返回真或假的过程

    使用步骤:

    • 定义NSPredicate对象并指定条件
    • 调用谓词的evaluateWithObject方法判断指定条件是否满足

    示例:

    NSPredicate*predicate = [NSPredicate predicateWithFormat:@"self CONTAINS '1'"];
    NSString *text = @"1234";
    NSLog(@"%d", [predicate evaluateWithObject:text]);
    

    案例:

    1.创建Person的对象数组
    2.查询判断姓名和年龄的过滤方法

    • 传统方法:
    NSMutableArray*result = [NSMutableArray arrayWithCapacity:personList.count];
    
    for (NSInteger i = 0; i < personList.count; i++) {
    
        Person *person = personList[i];
    
        // 用户年龄小于5 同时用户姓名中包含“1”字符串
        if (person.age < 5&& NSNotFound != [person.name rangeOfString:@"1"].location) {
            [result addObject:person];
        }
    }
    
    return result;
    
    • 谓词方法:
    NSPredicate*predicate = [NSPredicate predicateWithFormat:@"name CONTAINS '1' && %K BETWEEN {%d, %d}", @"age", 5, 15];
    
    NSArray*result = [personList filteredArrayUsingPredicate:predicate];
    

    谓词的条件指令

    1.比较运算符 > 、< 、== 、 >= 、<= 、 !=
    例:@"number >= 99"

    2.范围运算符:IN 、BETWEEN
    例:@"number BETWEEN {1,5}"
    @"address IN {'shanghai','nanjing'}"

    3.字符串本身:SELF
    例:@"SELF == 'APPLE'"

    4.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
    例:@"name CONTAIN[cd] 'ang'" //包含某个字符串
    @"name BEGINSWITH[c] 'sh'" //以某个字符串开头
    @"name ENDSWITH[d] 'ang'" //以某个字符串结束

    5.通配符:LIKE - 模糊查询
    例:@"name LIKE[cd] 'er'" //代表通配符,Like也接受[cd].
    @"name LIKE[cd] '???er
    '"

    注: 星号 "*" : 代表0个或多个字符
    问号 "?" : 代表一个字符

    6.正则表达式:MATCHES
    例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
    @"name MATCHES %@",regex

    注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。

    1. 合计操作
      ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。
      ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。
      NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。
      IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。

    提示:

    • 1、谓词中的匹配指令关键字通常使用大写字母
      1. 谓词中可以使用格式字符串
      1. 如果通过对象的key path指定匹配条件,需要使用 %K
    //  ViewController.m
    //  NSPredicate(谓词)
    
    #import "ViewController.h"
    #import "Person.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        [self test2];
    }
    
    /**
     *  过滤自定义对象
     */
    - (void)test2{
       
        Person *p1 = [Person new];
        p1.name = @"zhangsan";
        p1.age = 17;
       
        Person *p2 = [Person new];
        p2.name = @"lisi";
        p2.age = 15;
       
        Person *p3 = [Person new];
        p3.name = @"wangwu";
        p3.age = 20;
       
        Person *p4 = [Person new];
        p4.name = @"zhangquandan";
        p4.age = 32;
       
        Person *p5 = [Person new];
        p5.name = @"laowang";
        p5.age = 23;
       
        NSArray *persons = @[p1,p2,p3,p4,p5];
       
        //过滤名字里包含"zhang"
       
        //创建谓词
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[self.name](http://self.name) CONTAINS 'zhang'"];
       
        NSArray<Person *> *results = [persons filteredArrayUsingPredicate:predicate];
    //    NSLog(@"%@",[results valueForKey:@"name"]);
        
        //谓词单独作用于某个对象
        BOOL flag = [predicate evaluateWithObject:p5];
    
        if (flag == YES) {
            NSLog(@"包含zhang");
        }else{
            NSLog(@"不包含zhang");
        }
    }
    
    - (void)test1{
       
        NSArray *array = @[@"3523426",@"325638",@"235622246",@"54748",@"435622267"];
       
        //找出数组中含有"222"的元素
        //使用谓词(条件)过滤数组
        //创建谓词
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS '222'"];
       
        //结果
        NSArray *results = [array filteredArrayUsingPredicate:predicate];
       
        NSLog(@"%@",results);
    
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:101-谓词

          本文链接:https://www.haomeiwen.com/subject/qrqbrxtx.html