版本: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的结果