美文网首页Predicate
NSComparisonPredicate的使用

NSComparisonPredicate的使用

作者: 想聽丿伱說衹愛我 | 来源:发表于2020-09-09 10:08 被阅读0次

    版本:iOS13.7

    一、简介

    NSComparisonPredicate是比较谓词,通过左右两表达式组合来评估对象。
    NSComparisonPredicate是NSPredicate的子类,点击NSPredicate的使用查看NSPredicate的用法,以便更容易理解NSComparisonPredicate。
    NSComparisonPredicate中使用的NSExpression可点击NSExpression的使用了解。

    二、NSComparisonPredicate的API

    @interface NSComparisonPredicate : NSPredicate
    
    //创建一个比较谓词实例
    //lhs 左表达式 rhs 右表达式
    //modifier 修饰语 详见说明1
    //type 类型 详见说明2
    //options 选项 详见说明3
    //例子见例1
    + (NSComparisonPredicate *)predicateWithLeftExpression:(NSExpression *)lhs
                               rightExpression:(NSExpression *)rhs
                               modifier:(NSComparisonPredicateModifier)modifier 
                               type:(NSPredicateOperatorType)type 
                               options:(NSComparisonPredicateOptions)options;
    //创建一个比较谓词实例
    //lhs 左表达式 rhs 右表达式
    //此时type默认为NSCustomSelectorPredicateOperatorType
    //selector 选择器
    //例子见例2
    + (NSComparisonPredicate *)predicateWithLeftExpression:(NSExpression *)lhs
                               rightExpression:(NSExpression *)rhs
                               customSelector:(SEL)selector;
    //创建一个比较谓词实例
    //predicateWithLeftExpression:rightExpression:modifier:type:options:的实例初始化方法
    - (instancetype)initWithLeftExpression:(NSExpression *)lhs 
                    rightExpression:(NSExpression *)rhs 
                    modifier:(NSComparisonPredicateModifier)modifier 
                    type:(NSPredicateOperatorType)type 
                    options:(NSComparisonPredicateOptions)options;
    //创建一个比较谓词实例
    //predicateWithLeftExpression:rightExpression:customSelector:的实例初始化方法
    - (instancetype)initWithLeftExpression:(NSExpression *)lhs 
                    rightExpression:(NSExpression *)rhs 
                    customSelector:(SEL)selector;
    //初始化,一般不使用该方法而使用上面几种
    - (nullable instancetype)initWithCoder:(NSCoder *)coder;
    
    //类型 只读 详见说明2
    @property (readonly) NSPredicateOperatorType predicateOperatorType;
    //修饰语 只读 详见说明1
    @property (readonly) NSComparisonPredicateModifier comparisonPredicateModifier;
    //左表达式 只读
    @property (readonly, retain) NSExpression *leftExpression;
    //右表达式 只读
    @property (readonly, retain) NSExpression *rightExpression;
    //自定义的方法 只读 NSCustomSelectorPredicateOperatorType时才生效
    @property (nullable, readonly) SEL customSelector;
    //选项 只读 详见说明3
    @property (readonly) NSComparisonPredicateOptions options;
    
    @end
    
    • 说明1
    typedef NS_ENUM(NSUInteger, NSComparisonPredicateModifier) {
        //直接进行比较
        NSDirectPredicateModifier = 0,
        //用于评估对象为NSArray、NSSet,当对象的全部元素都符合表达式,才算通过
        NSAllPredicateModifier, 
        //用于评估对象为NSArray、NSSet,当对象的元素至少有一个符合表达式,就算通过
        NSAnyPredicateModifier
    };
    
    • 说明2
    typedef NS_ENUM(NSUInteger, NSPredicateOperatorType) {
        NSLessThanPredicateOperatorType = 0, //小于(即左表达式小于右表达式)
        NSLessThanOrEqualToPredicateOperatorType,//小于或等于 
        NSGreaterThanPredicateOperatorType, //大于
        NSGreaterThanOrEqualToPredicateOperatorType, //大于或等于
        NSEqualToPredicateOperatorType, //等于
        NSNotEqualToPredicateOperatorType, //不等于
        NSMatchesPredicateOperatorType,//正则 右表达式为正则表达式
        NSLikePredicateOperatorType,//like匹配,相当于=,但可以使用通配符?和*
        NSBeginsWithPredicateOperatorType,//左表达式以右表达式开头
        NSEndsWithPredicateOperatorType,//左表达式以右表达式结束
        NSInPredicateOperatorType, //左表达式为右表达式的集合元素
        NSCustomSelectorPredicateOperatorType,//通过自定义的方法验证
        NSContainsPredicateOperatorType = 99, //左表达式包含右表达式
        NSBetweenPredicateOperatorType//左表达式在右表达式的范围中 "left BETWEEN { 0 , 33 }"
    };
    
    • 说明3
      若不想指定,可以传0 。
    typedef NS_OPTIONS(NSUInteger, NSComparisonPredicateOptions) {
        //大小写不敏感 相当于"left LIKE[c] 'test'" 中的[c]
        NSCaseInsensitivePredicateOption = 0x01,
        //发音不敏感 相当于"left LIKE[d] 'test'" 中的[d]
        NSDiacriticInsensitivePredicateOption = 0x02,
        //表示要比较的字符串已经过预处理;这取代了其他选项,旨在作为性能优化选项
        NSNormalizedPredicateOption  = 0x04, 
    };
    
    • 例1
        NSExpression *left = [NSExpression expressionWithFormat:@"SELF"];
        NSExpression *right = [NSExpression expressionWithFormat:@"%@", @[@"aaa", @"bbb", @"ccc"]];
        NSComparisonPredicate *comparison = [NSComparisonPredicate predicateWithLeftExpression:left 
                    rightExpression:right modifier:NSAllPredicateModifier 
                    type:NSInPredicateOperatorType options:NSCaseInsensitivePredicateOption];
        NSLog(@"%@", [comparison predicateFormat]);
        BOOL success = [comparison evaluateWithObject:@[@"aaa", @"ccc"]];
        NSLog(@"%@", @(success));
    输出:
    ALL SELF IN[c] {"aaa", "bbb", "ccc"}
    1
    
    • 例2
        NSExpression *left = [NSExpression expressionWithFormat:@"SELF"];
        NSExpression *right = [NSExpression expressionWithFormat:@"%@", @[@"aaa", @"bbb", @"ccc"]];
        NSComparisonPredicate *selComparison = [NSComparisonPredicate predicateWithLeftExpression:left 
                                    rightExpression:right customSelector:@selector(test:)];
        NSLog(@"%@", [selComparison predicateFormat]);
        //当调用该方法时 会调用传入的对象self中的test:方法
        success = [selComparison evaluateWithObject:self];
        NSLog(@"%@", @(success));
    
    - (BOOL)test:(id)object {
        //object为右表达式
        NSLog(@"%@", object);
        return YES;
    }
    
    输出:
    SELF test: {"aaa", "bbb", "ccc"}
    (
        aaa,
        bbb,
        ccc
    )
    1
    

    可以看出表达式为SELF test: {"aaa", "bbb", "ccc"}
    evaluateWithObjec时会调用test:
    并将右表达式发送给test:,通过test:的返回的bool值来确定evaluateWithObjec的结果

    相关文章

      网友评论

        本文标题:NSComparisonPredicate的使用

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