美文网首页
iOS谓词NSPredicate

iOS谓词NSPredicate

作者: 浮生zZZ | 来源:发表于2021-03-22 09:13 被阅读0次

    谓词

    首先,我们可以看看官方文档的解释

    NSPredicate官方描述

    大概意思是: 一种逻辑条件的定义,用于约束查找或者内存中筛选的搜索条件。个人理解就是一个用来匹配查询结果的条件。

    NSPredicate的API

    // 通过表达式创建谓词实例
    + (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat, ...;
    
    // 表达式中的%@从arguments中取值
    + (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat argumentArray:(nullable NSArray *)arguments;
    
    // 表达式中的%@占位符将从argList中取值
    + (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat arguments:(va_list)argList;
    
    // 通过一个元数据查询字符串来创建谓词实例,仅macos可以使用
    + (nullable NSPredicate *)predicateFromMetadataQueryString:(NSString *)queryString API_AVAILABLE(macos(10.9)) API_UNAVAILABLE(ios, watchos, tvos);
    
    // 创建一个固定结果为BOOL值的谓词实例
    + (NSPredicate *)predicateWithValue:(BOOL)value;    
    
    // 根据block的回调的返回值创建一个结果为YES/NO的谓词实例
    + (NSPredicate*)predicateWithBlock:(BOOL (^)(id _Nullable evaluatedObject, NSDictionary<NSString *, id> * _Nullable bindings))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    // 获取谓词的表达式,只读属性
    @property (readonly, copy) NSString *predicateFormat;    
    
    // 用常量值代替变量,用字典中的键值对替换用$声明的变量
    - (instancetype)predicateWithSubstitutionVariables:(NSDictionary<NSString *, id> *)variables;    // substitute constant values for variables
    
    // 比较评估对象是否符合谓词
    - (BOOL)evaluateWithObject:(nullable id)object;    
    
    // 比较评估对象是否符合谓词
    - (BOOL)evaluateWithObject:(nullable id)object substitutionVariables:(nullable NSDictionary<NSString *, id> *)bindings API_AVAILABLE(macos(10.5), ios(3.0), watchos(2.0), tvos(9.0)); 
    
    // 强制使用已安全解码的谓词以进行评估
    - (void)allowEvaluation API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0)); 
    

    常用方法

    上面官方暴露的API我们可以看到创建NSPredicate基本都需要一个表达式

    创建谓词

     NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF CONTAINS 'world'"];
     NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", @"world"];
     NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@" argumentArray:@[@"world"]];
     NSLog(@"predicate1谓词表达式:%@", predicate1.predicateFormat);
     NSLog(@"predicate2谓词表达式:%@", predicate2.predicateFormat);
     NSLog(@"predicate3谓词表达式:%@", predicate3.predicateFormat);
    
    打印结果为: 谓词创建实例比较

    创建谓词并使用

    NSString *str = @"Hello, world";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS 'world'"];
    NSLog(@"谓词评估结果:%hhd",[predicate evaluateWithObject:str]);
    

    打印结果为:谓词评估结果:1

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS $variable"];
    predicate = [predicate predicateWithSubstitutionVariables:@{@"variable":@"world"}]; NSLog(@"谓词表达式为%@", [predicate predicateFormat]);
    
    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSArray * _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
          // 通过evaluatedObject和bindings来判断是否过滤
          if ([evaluatedObject containsObject:[bindings objectForKey:@"key"]]) {
                return YES;
          } else {
              return NO;
           }
    }];
    BOOL result = [predicate evaluateWithObject:@[@"1", @"2"] substitutionVariables:@{@"key":@"2"}];
    NSLog(@"谓词评估结果%hhd", result);
    

    NSPredicate的扩展

    @interface NSArray<ObjectType> (NSPredicateSupport)
    
    // 对数组中所有元素进行谓词评估,返回数组
    - (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 
    
    @end
    @interface NSMutableArray<ObjectType> (NSPredicateSupport)
    // 移除所有不符合谓词评估的数组元素
    - (void)filterUsingPredicate:(NSPredicate *)predicate; 
    @end
    
    

    NSSet相关类中也有类似的方法,使用与数组这边雷同。

    谓词表达式语法

    可以在关键字后面加在[cd],c表示忽略大小写,即CAFE与cafe为相同字符串;d表示忽略读音,即café与cafe为相同字符串。

    常用字面语义

    表达式 用途
    SELF 谓词评估的对象
    'text' 字符串text,使用双引号需要转义符\
    TRUE、YES 逻辑真
    FALSE、NO 逻辑假
    占位符
    表达式 用途
    %K 属性名
    %@ 属性值
    NSString *name = @"name";
    NSString *value = @"value";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", name, value];
    NSLog(@"谓词表达式%@", [predicate predicateFormat]);
    BOOL result = [predicate evaluateWithObject:@{@"name" : @"value111"}];
    NSLog(@"谓词结果为%hhd", result);
    

    输出结果为:谓词表达式name CONTAINS "value"

                      **谓词结果为1**
    

    基本比较运算

    表达式 用途
    =、== 等于
    >=、 => 大于或等于
    <=、=< 小于或等于
    > 大于
    < 小于
    !=、<> 不等于
    BETWEEN 值在区间内(包含边界数值)

    这边附上一个BETWEEN的使用例子

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {200, 250}"];
    NSLog(@"谓词评估结果:%hhd",  [predicate evaluateWithObject:@(212)]); // 谓词评估结果:1
    

    布尔值

    表达式 用途
    TRUEPREDICATE
    FALSEPREDICATE

    [NSPredicate predicateWithValue:YES]的表达式实际上就是TRUEPREDICATE

    逻辑运算
    表达式 用途
    AND、&&
    OR、||
    NOT、!
    字符串比较
    表达式 用途
    BEGINSWITH 字符串以...开始
    ENDSWITH 字符串以...结束
    CONTAINS 字符串包含...
    LIKE 字符串相等
    MATCHES 字符串匹配右边的正则表达式
    集合操作
    表达式 用途
    ANY、SOME 集合中是否至少有一个元素满足条件
    ALL 集合中所有元素满足条件
    NONE 集合中所有元素均不满足条件
    IN 被集合包含
    SELF[index] 取对应索引的元素
    SELF[FIRST] 第一个元素
    SELF[LAST] 最后一个元素
    SELF[SIZE] 元素的个数
    SELF['key']或SELF.key或key 字典对应key的元素

    参考链接1

    参考链接2

    如有错误,欢迎指正

    iOS开发QQ交流群:568571839,欢迎来撩~

    相关文章

      网友评论

          本文标题:iOS谓词NSPredicate

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