NSPredicate 谓词

/*

   本工程主要介绍谓词的使用

   // 参照  http://www.cocoachina.com/ios/20160111/14926.html

           http://blog.csdn.net/a380880304/article/details/49022179

 

 */


#import "ViewController.h"

#import "person.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

//    [self test1];

//    [self test2];

//    [self test3];

   // [self test4];

    [self test5];

   // [self test6];

}


#pragma mark 组合谓词

-(void)test6{

    NSArray *ary = @[@8,@18,@28,@38,@48,@58,@68];

    

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 18"];

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF < 58"];

    // predicate predicate1 组合使用

  NSCompoundPredicate *compoundPredicate =  [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1,predicate]];

   NSArray *result =  [ary filteredArrayUsingPredicate:compoundPredicate];

    NSLog(@"%@", result);  // 打印结果  28, 38, 48

    

   // [NSPredicate predicatewith]


    

    

    /*

     NSLessThanPredicateOperatorType = 0, // compare: returns NSOrderedAscending

     NSLessThanOrEqualToPredicateOperatorType, // compare: returns NSOrderedAscending || NSOrderedSame

     NSGreaterThanPredicateOperatorType, // compare: returns NSOrderedDescending

     NSGreaterThanOrEqualToPredicateOperatorType, // compare: returns NSOrderedDescending || NSOrderedSame

     NSEqualToPredicateOperatorType, // isEqual: returns true

     NSNotEqualToPredicateOperatorType, // isEqual: returns false

     NSMatchesPredicateOperatorType,

     NSLikePredicateOperatorType,

     NSBeginsWithPredicateOperatorType,

     NSEndsWithPredicateOperatorType,

     NSInPredicateOperatorType, // rhs contains lhs returns true

     NSCustomSelectorPredicateOperatorType,

     

     */

    

    /*

     NSCaseInsensitivePredicateOption = 0x01,

     NSDiacriticInsensitivePredicateOption = 0x02,


     */

    

    NSArray *nameAry = @[@"张三", @"李四" ,@"宋五", @"马留",@"张三",@"李四"];

    NSArray *ageAry = @[@8, @18, @28 , @38 , @48, @58];

    NSMutableArray *mary = [NSMutableArray array];

    for (int i = 0; i < nameAry.count; i++) {

        person *per = [person new];

        per.name = nameAry[i];

        per.age = ageAry[i];

        [mary addObject:per];

    }

    

    NSMutableArray *searchItemsPredicate = [NSMutableArray array];

    

    NSExpression *lhs = [NSExpression expressionForKeyPath:@"name"];

    NSExpression *rhs = [NSExpression expressionForConstantValue:@"张三"];

    NSPredicate *finalPredicate = [NSComparisonPredicate

                                   predicateWithLeftExpression:lhs

                                   rightExpression:rhs

                                   modifier:NSDirectPredicateModifier

                                   type:NSContainsPredicateOperatorType

                                   options:NSCaseInsensitivePredicateOption];

    [searchItemsPredicate addObject:finalPredicate];

    

    

    

    

    NSExpression *lhs1 = [NSExpression expressionForKeyPath:@"age"];

    NSExpression *rhs1 = [NSExpression expressionForConstantValue:@"25"];

    

    // NSCaseInsensitivePredicateOption  不区分大小写  相当于 [c],

    //  NSDiacriticInsensitivePredicateOption 忽略发音符号 相对于 [d]

    //  NSNormalizedPredicateOption  表示待比较的字符串已经被预处理了.

    

    NSPredicate *finalPredicate1 = [NSComparisonPredicate

                                   predicateWithLeftExpression:lhs1

                                   rightExpression:rhs1

                                   modifier:NSDirectPredicateModifier

                                   type:NSContainsPredicateOperatorType

                                   options:NSCaseInsensitivePredicateOption];

    [searchItemsPredicate addObject:finalPredicate1];

    

   NSCompoundPredicate *resultCompoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:searchItemsPredicate];

    

    NSArray *resultAry = [mary filteredArrayUsingPredicate:resultCompoundPredicate];

    

}



#pragma mark 筛选自定义类 占位符的使用

/*

 %K:用于动态传入属性名

 %@:用于动态设置属性值

 */


-(void)test5{

    NSArray *nameAry = @[@"张三", @"李四" ,@"宋五", @"马留",@"张三",@"李四"];

    NSArray *ageAry = @[@8, @18, @28 , @38 , @48, @58];

    NSMutableArray *mary = [NSMutableArray array];

    for (int i = 0; i < nameAry.count; i++) {

        person *per = [person new];

        per.name = nameAry[i];

        per.age = ageAry[i];

        [mary addObject:per];

    }

    

   // 检查出 name 是张三, 年龄是 48 的对象

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE '张三' && age = 48"];

    NSArray *result = [mary filteredArrayUsingPredicate:predicate];

    NSLog(@"%@", result);  // 打印结果  "<person: 0x7f98a0e215a0>"

// 占位符的使用

    

    NSString *key = @"name";

    NSString *value = @"张三";

    // 本例的意思是筛选出 person实例中 name 张三的对象.

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", key, value];

    NSArray *result1 = [mary filteredArrayUsingPredicate:predicate1];

    NSLog(@"%@", result1);

   


    // 查找出年龄大于 25岁的对象

    NSString *keyAge = @"age";

    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K > $AGEVAULE", keyAge];

    // $VALUE 赋值

  //  NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @20, @"AGEVAULE", nil];

    NSDictionary *dict = [NSDictionary dictionaryWithObject:@25 forKey:@"AGEVAULE"];

  NSPredicate *predicate3 =  [predicate2  predicateWithSubstitutionVariables:dict];

   NSArray *result3 = [mary filteredArrayUsingPredicate:predicate3];

    NSLog(@"result3  %@", result3);

}



#pragma mark 直接量

/*

 FALSENO:代表逻辑假

 TRUEYES:代表逻辑真

 NULLNIL:代表空值

 SELF:代表正在被判断的对象自身

 "string"'string':代表字符串

 数组:和c中的写法相同,如:{'one', 'two', 'three'}

 数值:包括整型、小数和科学计数法表示的形式

 十六进制数:0x开头的数字

 八进制:0o开头的数字

 二进制:0b开头的数字

 */




#pragma mark 集合运算符

/*

 ANYSOME:集合中任意一个元素满足条件,就返回YES

 ALL:集合中所有元素都满足条件,才返回YES

 NONE:集合中没有任何元素满足条件就返回YES。如:NONE person.age < 18,表示person集合中所有元素的age>=18时,才返回YES

 IN:等价于SQL语句中的IN运算符,只有当左边表达式或值出现在右边的集合中才会返回YES。我们通过一个例子来看一下

 

 */


-(void)test4{

    NSArray *ary = @[@"hello",@"betray",@"resemble",@"declare",@"reservation",@"shink"];

    NSArray *ary1 = @[@"betray",@"resemble",@"declare",@"period"];

    

    // 返回 目标数组 不在 ary数组中 的元素

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",ary];

    NSArray *result = [ary1 filteredArrayUsingPredicate:predicate];

    NSLog(@"%@",result);  // 打印结果  period

    


}



#pragma mark 字符串比较 test3

/*

 BEGINSWITH:检查某个字符串是否以指定的字符串开头(如判断字符串是否以a开头:BEGINSWITH 'a'

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

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

 LIKE:检查某个字符串是否匹配指定的字符串模板。其之后可以跟?代表一个字符和*代表任意多个字符两个通配符。比如"name LIKE '*ac*'",这表示name的值中包含ac则返回YES"name LIKE '?ac*'",表示name的第23个字符为ac时返回YES

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

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

 

 */

-(void)test3{

 

  NSString *str = @"Creates and returns a new predicate format by creating a new string with a given format and parsing the result";

    // 注意区分大小写, 区分 重音符号

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH 'Creates'"];

    NSPredicate *prediceta2 = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[cd] 'creates'"];

    if ([predicate evaluateWithObject:str]){

        NSLog(@"str 包含Creates ");

    }

    if([prediceta2 evaluateWithObject:str]){

        NSLog(@"str 包含Creates 不区分大小写  ");

    }

  /*

   2016-09-18 10:58:01.911 NSPredicate_谓词的使用[30548:1730520] str 包含Creates

   2016-09-18 10:58:01.912 NSPredicate_谓词的使用[30548:1730520] str 包含Creates 不区分大小写

   */

  // =======================

    /* 

     1.如果被筛选的string中包含空格, 会把string按空格分割,然后将分割的单个元素与 条件关键字匹配(本例是 'new'), 注意关键字 ('new') 与单个元素完全匹配才行, 而不是元素只要包含关键字就行.

     2.如果被筛选的string不包含空格, 会把string和关键字 (本例是 'new')进行匹配,只要包含就行.

    */

    NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"SELF LIKE[cd] '*new*'"];

        // 被筛选的字符串中(本例中指的是str) 不能包含空格, 否则一直返回NO

    NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"SELF LIKE[cd] '*eates'"];

    if ([predicate3 evaluateWithObject:str]) {

        NSLog(@"str 包含 new");

    }

    if ([predicate4 evaluateWithObject:str]) {

        NSLog(@"str 第一个字母后面是reates"); // 这样是检查不到的, 因为有空格 只能匹配到 creates

    }

    

}



#pragma mark  逻辑运算符 test2

/*

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

 OR||:逻辑或,要求其中一个表达式为YES时,结果就是YES

 NOT !:逻辑非,对原有的表达式取反

 */

-(void)test2{

 // 筛选出 ary >50 && < 100 的数

    NSArray *ary = @[@123,@12,@66,@78,@0,@34];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 50 && SELF < 100"];

    /*

     1. 会自动遍历数组

     2.  返回一个 符合要求的数据 数组,

     */

   NSArray *result = [ary filteredArrayUsingPredicate:predicate];

    NSLog(@"ary  %@", ary);

    NSLog(@"result  %@", result);

    

  //================

    NSMutableArray *mary = [ary mutableCopy];

   NSArray *result1 = [mary filteredArrayUsingPredicate:predicate];

    NSLog(@"mary %@", mary);

    NSLog(@"result1 %@", result1);

    

    

    //========= 打印结果

    /*

     2016-09-18 10:36:41.201 NSPredicate_谓词的使用[30495:1720212] ary  (

     123,

     12,

     66,

     78,

     0,

     34

     )

     2016-09-18 10:36:41.201 NSPredicate_谓词的使用[30495:1720212] result  (

     66,

     78

     )

     2016-09-18 10:36:41.201 NSPredicate_谓词的使用[30495:1720212] mary (

     123,

     12,

     66,

     78,

     0,

     34

     )

     2016-09-18 10:36:41.201 NSPredicate_谓词的使用[30495:1720212] result1 (

     66,

     78

     )


     */

}


#pragma mark 比较运算 test1

/*

 >==>:判断左边表达式的值是否大于或等于右边表达式的值

 <==<:判断右边表达式的值是否小于或等于右边表达式的值

 >:判断左边表达式的值是否大于右边表达式的值

 <:判断左边表达式的值是否小于右边表达式的值

 !=<>:判断两个表达式是否不相等

 BETWEENBETWEEN表达式必须满足表达式 BETWEEN {下限,上限}的格式,要求该表达式必须大于或等于下限,并小于或等于上限

 */


-(void)test1{

    

    NSNumber *num = @123;

    // SELF 代表自己

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF >= 100"];

    

    /*

     - (BOOL)evaluateWithObject:(nullable id)object;

     一个NSPredicate 评价(评价是我的直译, 也可以理解成过滤)一个obj, 当满足时返回YES

     */

    

    if ([predicate evaluateWithObject:num]) {

        NSLog(@"满足  %@", num);  // 打印结果  满足  123

    }

}

@end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值