iOS中的谓词(NSPredicate)使用

作者: George2016 | 来源:发表于2017-02-21 15:48 被阅读1154次

    NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。

    一、NSPredicate的基本用法

    1.比较运算符

    • =、==:判断两个表达式是否相等,在谓词中=和==是相同的意思,没有赋值一说。
    • >=、=>:判断左边的值是否大于或等于右边
    • <=、=<:判断左边的值是否小于或等于右边
    • >:判断左边的值是否大于右边
    • <:判断左边的值是否小于右边
    • !=、<>:判断两个表达式是否不相等
    • BETWEEN:BETWEEN表达式必须满足表达式 BETWEEN {下限,上限}的格式,要求该表达式必须大于或等于下限,并小于或等于上限
        NSNumber *number = @123;
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self = 123"];
        BOOL result = [predicate evaluateWithObject:number];
        //result is YES
    
        NSNumber *number = @123;
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self between {123, 200}"];
        BOOL result = [predicate evaluateWithObject:number];
        //result is YES
    

    2.比较运算符

    • AND、&&:逻辑与
    • OR、||:逻辑或
    • NOT、!:逻辑非
        NSArray *array = @[@1, @2, @3, @4, @5, @6, @7];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > 2 && self < 5"];
        NSArray *filterArray = [array filteredArrayUsingPredicate:predicate];
        //filterArray is @[@3, @4];
    

    3.字符串比较运算符

    • BEGINSWITH:是否以指定字符串开头;
    • ENDSWITH:是否以指定字符串结尾;
    • CONTAINS:是否包含指定字符串;
    • LIKE:是否匹配指定字符串模版;
    • MATCHES:是否匹配指定的正则表达式;

    1.以abc开头:beginswith 'abc'; </br> 2.匹配模版:"name like 'abc'":表示name的值中包含abc则返回YES;"name like '?abc*'":表示name的第2、3、4个字符为abc时返回YES;</br>3.正则表达式的效率最低,但功能最强大。

    字符串比较都是区分大小写和重音符号的。如:café和cafe是不一样的,Cafe和cafe也是不一样的。如果希望字符串比较运算不区分大小写和重音符号,请在这些运算符后使用[c],[d]选项。其中[c]是不区分大小写,[d]是不区分重音符号,其写在字符串比较运算符之后,比如:name LIKE[cd] 'cafe',那么不论name是cafe、Cafe还是café上面的表达式都会返回YES。

    4.集合运算符

    • ANY、SOME:集合中任意一个元素满足条件,就返回YES。
    • ALL:集合中所有的元素都满足条件,才返回YES。
    • NONE:集合中没有任何元素满足条件就返回YES。
    • IN:等价于SQL语句中的IN运算符。
        NSArray *array = @[@1, @2, @3, @4, @5, @6, @7];
        NSArray *filterArray = @[@1, @4, @8];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"not (self in %@)", filterArray];
        NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
        //resultArray is @[@2, @3, @5, @6, @7];
    

    5.保留字

    AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE

    注:虽然大小写都可以,但是更推荐使用大写来表示这些保留字

    谓词用法

    1.判断模型符合条件
    首先定义一个模型
    Person.h

    @interface Person : NSObject
    
    @property (nonatomic, copy  ) NSString *name;
    @property (nonatomic, assign) NSInteger age;
    
    +(instancetype)Person:(NSString *)name Age:(NSInteger)age;
    @end
    

    ViewController.h

        Person *person = [Person Person:@"张三" Age:15];
        //1.判断姓名是否以“张”开头
        NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"name like '张*'"];//name必须是模型中已存在的属性
        BOOL result = [predicate1 evaluateWithObject:person];
        //result is YES
        
        //2.判断年龄是否大于25
        NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"age > 25"]; //age必须是模型中已存在的属性
        result = [predicate2 evaluateWithObject:person];
        //result is NO
    

    2.判断手机号

     - (BOOL)checkPhoneNumber:(NSString *)phoneNumber {
        NSString *regex = @"^[1][3-8]\\d{9}$";
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
        return [pred evaluateWithObject:phoneNumber];
    }
    

    3.筛选数组

        NSMutableArray *arrayM = [@[@20, @40, @50, @30, @60, @70] mutableCopy];
        //  过滤大于50的值
        NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF > 50"];
        //该方法只有可变数组才有,不可变数组没有此方法
        [arrayM filterUsingPredicate:pred1];
    

    4.筛选数组中的模型

        NSArray *array = @[[Person Person:@"张三" Age:12],
                           [Person Person:@"张云" Age:24],
                           [Person Person:@"李四" Age:25]];
    
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains '张'"];
        NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
        //resultArray is "[name = 张三, age = 12], [name = 张云, age = 24]"
    

    5.谓词中的占位符参数

    %K:用于动态传入属性名
    %@:用于动态设置属性值
    $VALUE:个人感觉是在声明变量
    
        NSArray *array = @[[Person Person:@"张三" Age:12],
                           [Person Person:@"张云" Age:24],
                           [Person Person:@"李四" Age:25]];
    
        NSString *property = @"name";
        NSString *value = @"张";
        //1.筛选出名字中包含"张"的;
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K contains %@", property, value];
        NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
        //resultArray is "[name = 张三, age = 12], [name = 张云, age = 24]"
        
        //2.筛选出年龄大于24的;
        NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K > $Value", @"age"];
        //必须加上下面这句,不然会报错。$Value(Value可以随便改,统一就行)个人感觉是声明一个变量,下面是给变量赋值。
        predicate2 = [predicate2 predicateWithSubstitutionVariables:@{@"Value":@24}];
        NSArray *resultArray2 = [array filteredArrayUsingPredicate:predicate2];
        //resultArray2 is "[name = 李四, age = 25]"
    

    相关文章

      网友评论

        本文标题:iOS中的谓词(NSPredicate)使用

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