NSComparisonPredicate的使用

版本: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的使用)