NSPredicate的使用

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

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

1、比较运算符:

=、==:判断两个表达式是否相等,在谓词中=和==是相同的意思都是判断,而没有赋值这一说

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

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

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

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

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

如果与字符串比较需要加上单引号如@“ self  =  ‘music’   ”

    NSString *str = @"music";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self = 'music'"];
    BOOL b = [predicate evaluateWithObject:str];
    NSLog(@"结果:%zd", b);
结果:

结果:1


2、逻辑运算符

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

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

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

NSArray *arr = @[[[Person alloc] initWithName:@"mingzi" age:10],
                     [[Person alloc] initWithName:@"a" age:1],
                     [[Person alloc] initWithName:@"zhansan" age:25],
                     ];
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age > 1 && self.name = 'zhansan' "];
    NSArray *ar = [arr filteredArrayUsingPredicate:predicate];
    NSLog(@"%@", ar);
    Person *p = ar.lastObject;
    NSLog(@"XXXXX::%@ , %d", p.name, p.age);
结果:

xxxx: zhansan,25



3、字符串比较运算符

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

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

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

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

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

注:字符串比较都是区分大小写和重音符号的。其中[c]是不区分大小写,[d]是不区分重音符号, [cd]不区分重音也不区分大小写

    NSString *str = @"music";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS 'C'"];
    BOOL b = [predicate evaluateWithObject:str];
    NSLog(@"结果:%zd", b);
结果:

结果:0

    NSString *str = @"music";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS[c] 'C'"];
    BOOL b = [predicate evaluateWithObject:str];
    NSLog(@"结果:%zd", b);
结果:

结果:1

正则:

NSString * regex = @"^[\u4E00-\u9FA5]+$";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    result = [pred evaluateWithObject:self.userNameTF.text];
    if (!result) {
        [self showSuccessOrFailedMessage:@"姓名只能输入汉字"];
        return;
    }
注:只有在正则表达式为^表达式$时才使用谓词

4、集合运算符

  • ANY、SOME:集合中任意一个元素满足条件,就返回YES。如:ANY  person.age >= 18  

  • ALL:集合中所有元素都满足条件,才返回YES。如: ALL person.age >= 18

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

  • IN:等价于SQL语句中的IN运算符,只有当左边表达式或值出现在右边的集合中才会返回YES。

    NSArray *arr1 = @[[[Person alloc] initWithName:@"mingzi" age:10],
                      [[Person alloc] initWithName:@"a" age:1],
                      [[Person alloc] initWithName:@"zhansan" age:25],
                      [[Person alloc] initWithName:@"mingzi" age:15]];
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name in {'a'}"];
    NSArray *ar = [arr1 filteredArrayUsingPredicate:predicate];
    NSLog(@"%@", ar);
    Person *p = ar.lastObject;
    NSLog(@"XXXXX::%@ , %d", p.name, p.age);
结果:

结果:xxxx:: a,   1

  • array[index]:返回array数组中index索引处的元素

  • array[FIRST]:返回array数组中第一个元素

  • array[LAST]:返回array数组中最后一个元素

  • array[SIZE]:返回array数组中元素的个数

其他:

  • FALSE、NO:代表逻辑假

  • TRUE、YES:代表逻辑真

  • NULL、NIL:代表空值

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

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

  • 数组:和c中的写法相同,如:{'a', 'b', 'cds'}。



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

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

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

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

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

- (NSSet*)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSArray中的方法

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

- (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSMutableArray中的方法。

通过上面的描述可以看出,使用谓词过滤不可变集合和可变集合的区别是:过滤不可变集合时,会返回符合条件的集合元素组成的新集合;过滤可变集合时,没有返回值,会直接剔除不符合条件的集合元素



你可能感兴趣的:(iPhone开发)