Objective-C之谓词NSPredicate

NSPredicate用于定义一个逻辑条件,通过该条件可执行搜索或内存中的过滤操作。

一.谓词的定义

谓词是由NSPredicate对象来代表,在实际编程中会直接使用NSPredicatepredicateWithFormat:方法,以一个谓词字符串为参数来创建NSPredicate对象。

//无占位符
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like 's*' "];

创建谓词之后—>

1.如果谓词中没有占位符参数,即可用NSPredicate的evaluateWithObject:方法计算谓词的结果,该结果总是一个BOOL值。

2.如果谓词中有占位符参数,则需要经过两步来计算谓词的结果:

  • 调用谓词的predicateWithSubstitutionVariables:方法为占位符参数设置参数值。
  • 执行谓词的evaluateWithObject:方法计算谓词的返回结果
#import <Foundation/Foundation.h>
#import "User.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        User *user = [[User alloc] initWithName:@"Hello,World" Age:100];

        NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like 'Hello,*' "];//创建一个谓词

        BOOL result = [pre evaluateWithObject:user];//根据指定对象user来计算谓词的值
        NSLog(@"result = %d",result);
    }
    return 0;
}

二.使用谓词过滤集合

谓词的一个常用功能是对集合进行过滤。

  • NSArray
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;

使用指定的谓词过滤NSArray集合,返回该集合中符合谓词条件的元素组成的元素。

  • NSMutableArray
- (void)filterUsingPredicate:(NSPredicate *)predicate;   

使用指定的谓词过滤NSMutableArray集合,剔除该集合中不符合条件的元素。

  • NSSet
- (NSSet *)filteredSetUsingPredicate:(NSPredicate *)predicate;    
  • NSMutableSet
- (void)filterUsingPredicate:(NSPredicate *)predicate; 

示例代码:


#import <Foundation/Foundation.h>
#import "User.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //过滤NSMutableArray
        NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSNumber numberWithInt:20],[NSNumber numberWithInt:50],[NSNumber numberWithInt:80], nil];
        NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF >50"];
        [array filterUsingPredicate:pre];
        NSLog(@"value > 50 %@",array);

        //过滤NSSet
        NSSet *set = [NSSet setWithObjects:[[User alloc] initWithName:@"Swift" Age:3],[[User alloc] initWithName:@"Objective-C" Age:20],[[User alloc] initWithName:@"C++" Age:30], nil];
        NSPredicate *pred = [NSPredicate predicateWithFormat:@" name CONTAINS 'C'"];
        NSSet *newSet = [set filteredSetUsingPredicate:pred];
        NSLog(@"%@",newSet);


    }
    return 0;
}

三.在谓词中使用占位符

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

  • %K:该占位符用于动态传入属性名
  • %@:该占位符用于动态设置属性值

除此之外,还可以在谓词表达式中使用动态改变的属性值,类似于环境变量,使用$str形式表示。

[NSPredicate predicateWithFormate:@"name CONTAINS $SUBSTR"];
  • 首先调用NSPredicate的predicateWithSubstitutionVariables:方法为占位符参数设置参数值,该方法返回一个可用的NSPredicate对象。
  • 直接调用NSPredicate的evaluateWithObject:substitutionVariables:方法同时完成参数设置和计算结果。

示例代码:

#import <Foundation/Foundation.h>
#import "User.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSSet *set = [NSSet setWithObjects:[[User alloc] initWithName:@"阿里巴巴" Age:21],[[User alloc] initWithName:@"腾讯" Age:22],[[User alloc] initWithName:@"百度" Age:23],[[User alloc] initWithName:@"阿里云" Age:24], nil];
        NSString *path = @"name";
        NSString *value = @"阿里";
        NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K CONTAINS %@",path,value];
        NSSet *newSet = [set filteredSetUsingPredicate:pre];

        NSLog(@"newSet = %@",newSet);

        NSPredicate *temp = [NSPredicate predicateWithFormat:@"%K CONTAINS $SUBSTR",@"name"];

        NSPredicate *pre1 = [temp predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:@"度",@"SUBSTR", nil]];
        NSSet *newSet1 = [set filteredSetUsingPredicate:pre1];
        NSLog(@"newSet1 = %@",newSet1);

        NSPredicate *pre2 = [temp predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:@"讯",@"SUBSTR", nil]];
        NSSet *newSet2 = [set filteredSetUsingPredicate:pre2];
        NSLog(@"newSet2 = %@",newSet2);
    }
    return 0;
}

四.谓词表达式语法

1.基本的比较运算符

  • =、==
  • >=、=>
  • <=、=<:
  • >
  • <
  • !=、<>
  • BETWEEN:这个表达式必须满足”表达式 BETWEEN {下限,上限}“,要求表达式的值大于等于下限,小于等于上限

2.基本的逻辑运算符

  • AND、&&
  • OR、||
  • NOT、!

3.字符串比较运算符

  • BEGINSWITH
  • ENDSWITH
  • CONTAINS
  • LIKE
  • MATCHES:检查某个字符串是否匹配指定的正则表达式,MATCHES后面可使用正则表达式。

4.操作集合的运算符

  • ANY、SOME
  • ALL
  • NONE
  • IN:只有左边表达式或值出现在右边的集合中才会返回YES。,例如,name IN {'Ricky','David'}

5.直接量

  • SELF:代表正在被判断的对象本身。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值