最近发现项目中用到了 NSPredicate ,发现以前除了涉及正则表达式以外,自己好像都没单独用过过滤这块的功能,特此去了解下。
- 1、它是什么
- 2、常用在什么地方
- 3、使用小例
一、它是什么
NSPredicate类是用于定义逻辑条件用于限制搜索获取或者内存筛选。
这让 我立马想到了上周笔记的 KVC集合运算符中的简单的集合运算符,同样拥有刷选条件功能,但是它们有什么不同呢?
二、常用在什么地方
从 NSPredicate.h 文件中我们可以看到他的常用方法,除了用正则表达式判断以外,可以重点看看它所支持的对象。(NSPredicateSupport)
- NSArray(NSMutableArray)
- NSSet (NSMutableSet)
- NSOrderedSet (NSMutableOrderedSet)
对于我们来说,熟练使用好 NSArray 和 NSMutableArray 是最主要的。
三、使用小例
- 正则表达式
NSString *stringRegex = @"^[0-9]*$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stringRegex];
BOOL result = [predicate evaluateWithObject:testString];
- NSArray
- (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate;
- NSMutableArray
- (void)filterUsingPredicate:(NSPredicate *)predicate;
举例
以NSArray 和 NSMutableArray 用:
@interface TestModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSNumber *age;
@end
NSArray *nameArray = @[@"one",@"two",@"four",@"three"];
NSArray *ageArray = @[@23,@20,@34,@17];
NSMutableArray *testArray = [NSMutableArray arrayWithCapacity:nameArray.count];
[nameArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
TestModel *model = [[TestModel alloc] init];
model.name = nameArray[idx];
model.age = ageArray[idx];
[testArray addObject:model];
}];
// NSArray
NSPredicate *testNamePredicate = [NSPredicate predicateWithFormat:@"name=='one'"];
NSArray *testNameArray = [testArray filteredArrayUsingPredicate:testNamePredicate];
if (!testNamePredicate || !(testNameArray.count > 0)){
NSLog(@"NSArray Error");
return;
}
[testNameArray enumerateObjectsUsingBlock:^(TestModel *model, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"testArray Name == %@",model.age); // 23
}];
// NSMutableArray
NSPredicate *testAgePredicate = [NSPredicate predicateWithFormat:@"age>30"];
[testArray filterUsingPredicate:testAgePredicate];
if(!testAgePredicate|| !(testArray.count > 0)) {
NSLog(@"NSMutableArray Error");
return;
}
[testArray enumerateObjectsUsingBlock:^(TestModel *model, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"testArray Name == %@",model.age); // 34
}];
此时发现,为了过滤条件,适当的了解 谓词语法 是必须的。目前对于我来说,最主要的是:
- 比较
就是常用的 > 、< 、=、!=
@"age > 20"
- 简单过滤
过滤的属性(key.path) = ‘过滤的内容’
@"name == 'one'"
此处只是冰山一角,当然想要了解更多刷选条件可以去看 苹果官方文档 Creating Predicates,里面一些类似SQL的语句的条件刷选是相当方便的,特别是用惯SQL 语句的同学来说。