美文网首页
NSPredicate 过滤

NSPredicate 过滤

作者: 天空中的球 | 来源:发表于2016-09-19 12:02 被阅读107次

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

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

    一、它是什么

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

    Format string Summary
    笔记来源:

    相关文章

      网友评论

          本文标题:NSPredicate 过滤

          本文链接:https://www.haomeiwen.com/subject/flngettx.html