NSPredicate 过滤

2016-09-19  本文已影响107人  天空中的球

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

一、它是什么

NSPredicate
NSPredicate类是用于定义逻辑条件用于限制搜索获取或者内存筛选。

这让 我立马想到了上周笔记的 KVC集合运算符中的简单的集合运算符,同样拥有刷选条件功能,但是它们有什么不同呢?

二、常用在什么地方

从 NSPredicate.h 文件中我们可以看到他的常用方法,除了用正则表达式判断以外,可以重点看看它所支持的对象。(NSPredicateSupport)

对于我们来说,熟练使用好 NSArray 和 NSMutableArray 是最主要的。

三、使用小例

NSString *stringRegex = @"^[0-9]*$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stringRegex];
BOOL result = [predicate evaluateWithObject:testString];
- (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate;  
- (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"
@"name == 'one'"

此处只是冰山一角,当然想要了解更多刷选条件可以去看 苹果官方文档 Creating Predicates,里面一些类似SQL的语句的条件刷选是相当方便的,特别是用惯SQL 语句的同学来说。

Format string Summary
笔记来源:
上一篇下一篇

猜你喜欢

热点阅读