NSPredicate 过滤

最近发现项目中用到了 NSPredicate ,发现以前除了涉及正则表达式以外,自己好像都没单独用过过滤这块的功能,特此去了解下。

  • 1、它是什么
  • 2、常用在什么地方
  • 3、使用小例

一、它是什么

NSPredicate 过滤_第1张图片
NSPredicate

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 *)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 语句的同学来说。

NSPredicate 过滤_第2张图片
Format string Summary

笔记来源:
  • NSPredicate
  • 苹果官方文档 Creating Predicates

你可能感兴趣的:(NSPredicate 过滤)