%K:用于动态传入属性名
%@:用于动态设置属性值
1、比较运算符:
=、==:判断两个表达式是否相等,在谓词中=和==是相同的意思都是判断,而没有赋值这一说
>=,=>:判断左边表达式的值是否大于或等于右边表达式的值
<=,=<:判断右边表达式的值是否小于或等于右边表达式的值
>:判断左边表达式的值是否大于右边表达式的值
<:判断左边表达式的值是否小于右边表达式的值
!=、<>:判断两个表达式是否不相等
如果与字符串比较需要加上单引号如@“ self = ‘music’ ”
NSString *str = @"music";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self = 'music'"];
BOOL b = [predicate evaluateWithObject:str];
NSLog(@"结果:%zd", b);
结果:
结果:1
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:检查某个字符串是否匹配指定的正则表达式。虽然正则表达式的执行效率是最低的,但其功能是最强大的,也是我们最常用的。
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中的方法。
通过上面的描述可以看出,使用谓词过滤不可变集合和可变集合的区别是:过滤不可变集合时,会返回符合条件的集合元素组成的新集合;过滤可变集合时,没有返回值,会直接剔除不符合条件的集合元素