Cocoa 提供了 NSPredicate 类,用于指定过滤器的条件。可以创建 NSPredicate 对象,通过它准确地描述所需的条件,通过谓词筛选每一个对象,判断它们是否与条件相匹配。
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormate:@"name == 'Join'"];
Bool ismatch = [predicate evaluateWithObject:person];//判断 person 类是否满足谓词条件
//常用作数组过滤器
NSArray *array=[@"abc",@"a bdc",@"abode",@"abcse",@"awessebsdewc",@"453abc",@"a45bc3433",@"abc34522",@"asdfad",@"alkmbc",@"abcopjoj",@"abjoc",@"khujabc",@"abc9074",];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", @"abc"];
//SELF 表示的是响应谓词计算的对象。[cd] 表示既不区分大小写,也不区分发音符号。[c] 表示不区分大写,[d] 表示不区分发音符号。
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
谓词过滤的筛选条件:
1、逻辑运算符号(> , < , = , >= , <=) 。并且和 &&, || ,AND, OR 谓词一起使用不区分大小写。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"height > 180 && width > 30"];
2、范围运算符(IN,BETWEEN)。
NSPredicate *predicate = [NSPredicate predicateWithFormat:"height BETWEEN {10, 50}"];
3、字符串之开头和结尾(BEGINSWITH, ENDSWITH)
BEGINSWITH: 以...开头
ENDSWITH: 以...结尾
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'J'"];
4、字符串之包含和模糊查询(CONTAINS,LIKE)
CONTAINS: 包含某个字符串
LIKE: 模糊查询
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE '*o*'"];
5、字符串匹配查询(SELF)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", @"abc"];
6、正则表达式(MATCHES)
NSString *reg = @"^J.+n$";//以 J 开头,以 n 结尾的字符。
NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", reg];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[c] %@",preStr,keyStr];
//%@会被当作一个有引号的字符串的格式说明符,%d、%f是数字的格式说明符,后面添加对应格式的变量。
//需要改变键路径时,使用%K作为键路径的格式说明符。