您的位置:首页 > 其它

NSPredicate的使用

2016-10-28 16:28 134 查看
%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;
}
注:<span style="color: rgb(37, 37, 37); font-family: "Helvetica Neue", Helvetica, STheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif; font-size: 14px; background-color: rgb(250, 250, 250);">只有在正则表达式为^表达式$时才使用谓词</span>


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中的方法。

通过上面的描述可以看出,使用谓词过滤不可变集合和可变集合的区别是:过滤不可变集合时,会返回符合条件的集合元素组成的新集合;过滤可变集合时,没有返回值,会直接剔除不符合条件的集合元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NSPredicate 谓词